web-dev-qa-db-ja.com

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

このコードは/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ジョブを安全に削除できますか?

180
resting

>> /dev/nullは標準出力(stdout)を/dev/nullにリダイレクトし、それを破棄します。

>>は追記を意味し、>>は切り捨てと書き込みを意味し、>への追記と筆記のどちらも同じ効果があるので、/dev/nullは余分なものに思えます。通常は単に>を使用します。)

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

286
zigg

>> /dev/null 2>&1ステートメントを複数の部分に分割しましょう。


Part 1:>>の出力リダイレクト

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


Part 2:/dev/nullスペシャルファイル

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

コマンドls -l /dev/nullはこのファイルの詳細をあなたに与えるでしょう:

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

crwを見ましたか?つまり、シリアルアクセスを提供する 文字型特殊ファイル タイプの 疑似デバイス ファイルです。

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


Part 3:2>&1ファイルディスクリプタ

プログラムを実行するときはいつでも、ファイルが開かれるたびにオペレーティングシステムは常に3つのファイルSTDINSTDOUT、およびSTDERRを開き、オペレーティングシステム( kernel から)は という負でない整数を返しますファイル記述子 。これらのファイルのファイル記述子は、それぞれ0、1、2です。

したがって2>&1は単にSTDERRSTDOUTにリダイレクトすると言うだけです。

&は、その後に続くものがファイル記述子であり、ファイル名ではないことを意味します。

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

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
111
Vishrant

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

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

2>&1部分は、「出力ストリームとエラーストリームの両方をリダイレクトする」という意味です。プログラムがstderrに書き込んでも、その出力は表示されません。

51
dasblinkenlight

/dev/null - 書き込みをすべて破棄しますが、書き込み操作が成功したことを報告する標準ファイル。 1は標準出力、2は標準エラー出力です。 2>&1は標準エラー出力を標準出力にリダイレクトします。 &1はファイル記述子(stdout)を示します。それ以外の場合(単に1を使用する場合)、stderrを1という名前のファイルにリダイレクトします。 [any command] >>/dev/null 2>&1は、すべてのstderrをstdoutにリダイレクトし、そのすべてを/dev/nullに書き込みます。

13
Iurii

私はサイレントcronjobに>> /dev/null 2>&1を使います、cronjobは仕事をします、しかし、私の電子メールに報告を送りません。

私の知る限りでは、/dev/nullを削除しないでください、それはあなたがcpanelを実行しているとき、それは特に役に立ちます。

5
Christian

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

0
FSMaxB

/etc/conf.apfを編集してください。 DEVEL_MODE="0"を設定してください。 DEVEL_MODE1に設定すると、5分後にapfを停止するcronジョブが追加されます。

0
dstonek