回答:
1
表し、標準出力(stdout)。2
意味標準エラー(stderrを)。
したがって2>&1
、標準出力がリダイレクトされる場所にも標準エラーを送信するように指示します。送信されるので/dev/null
、出力をまったく無視することに似ています。
0
(STDIN)、1
(STDOUT)と2
(標準エラー出力)が、実際にファイルディスクリプタているシェルはリダイレクトに彼らの前に置かアンパサンドが必要です。この場合、ファイル記述子を複製し、2つの情報ストリームを効果的にマージします。
curl http://www.google.com 2>/dev/null
ここの「2」はstderrを意味するものであり、curlコマンドに渡す2番目のパラメーターではないことをコマンドラインはどのように認識しますか?
stderr
ストレートから/dev/null
代わりに送信されます。あなたは試みることによって、実際にそれを見ることができるcurl
、curl 1>/dev/null
とcurl 2>/dev/null
だけ出力の変化を見るために。繰り返しますが、アンパサンドはリダイレクトされるファイル記述子にのみ必要です。
バックグラウンドでフェッチhttp://www.google.com
し、との両方を破棄します。stdout
stderr
curl http://www.google.com > /dev/null 2>&1 &
と同じです
curl http://www.google.com > /dev/null 2>/dev/null &
0
、1
および2
標準のファイルを表す記述子でPOSIXのオペレーティングシステムを。ファイル記述子は、(基本的に)ファイルまたはソケットへのシステム参照です。
Cで新しいファイル記述子を作成すると、次のようになります。
fd = open("data.dat", O_RDONLY)
ほとんどのUnixシステムコマンドは、入力を受け取り、結果を端末に出力します。curl
指定されたurl(google dot com)にあるものをすべて取得し、結果をに表示しstdout
ます。
あなたのように言った<
と>
どこかに、ファイルのようにコマンドの出力をリダイレクトするために使用されています。
たとえば、でls > myfiles.txt
、ls
現在のディレクトリのコンテンツを取得し、>
その出力をリダイレクトしますmyfiles.txt
(ファイルが存在しない場合は作成され、それ以外の場合は上書きされますが、>>
代わりに>
ファイルに追加する代わりに使用できます)。上記のコマンドを実行すると、ターミナルに何も表示されないことに気付くでしょう。それは通常、Unixシステムでの成功を意味します。これをチェックしcat myfiles.txt
て、ファイルの内容を画面に表示します。
最初の部分はを> /dev/null
リダイレクトしますstdout
。これはcurl
の出力です/dev/null
(これについては先に説明します)に2>&1
リダイレクトstderr
しますstdout
(リダイレクトされた/dev/null
ので、すべてが送信されます/dev/null
)。
左側が2>&1
わかりますどのようなリダイレクトされ、右側がわかりますどこに。&
区別するために右側に使用されているstdout (1)
か、stderr (2)
指定されたファイルから1
か2
。その2>1
ため、新しいファイル(まだ存在しない場合)を作成して1
、stderr
結果をそこにダンプします。
/dev/null
は空のファイルで、書き込まれたものをすべて破棄するために使用されるメカニズムです。したがって、
の出力をcurl http://www.google.com > /dev/null
効果的に抑制していcurl
ます。
しかし、なぜ端末に表示されるものがあるのですか?これは通常の出力ではなく curl
、に送信されるデータでありstderr
、ここではエラーだけでなく進行状況と診断情報を表示するために使用されます。
curl http://www.google.com > /dev/null 2>&1
curl
の出力curl
情報とs進行情報の両方を無視します。その結果、端末には何も表示されません。
&
最後には、あなたのようにコマンドを実行するためにシェルを伝える方法です仕事で背景。これにより、コマンドがバックグラウンドで非同期に実行されている間、プロンプトがすぐに戻ります。現在のジョブを確認するにjobs
は、ターミナルに入力します。これは、システムで実行されているプロセスとは異なることに注意してください。top
ターミナルでこれらのタイプを表示するには。
/dev/null
?curl
少なくともどこかでの結果が役に立つと思いませんか?
私は次のように理解しています:
画面上のコマンドの出力およびエラー情報のみを読み取りたい場合は、次のように記述します。
curl http://www.google.com
また、後で確認するために、出力情報を端末画面ではなくファイルに保存したい場合は、次のように記述できます。
curl http://www.google.com > logfile
ただし、この方法では>
、StdOutをにリダイレクトするだけなので、StdErr情報は省略されlogfile
ます。
したがって、実行に失敗したコマンドのエラー情報を気にする場合は、2>&1
(StdErrをStdOutに折り畳むことを意味する)を使用してStdOutとStdErrを組み合わせる必要があるため、次のコマンドラインを記述できます:
curl http://www.google.com > logfile
2>&1