shell – “2>&1” はコマンドラインで何をするのか?

command-line redirection shell

コマンドラインで出力リダイレクトに>記号が使われていることは知っているのですが、コマンドラインで2>&1記号が使われていることを説明しているものが見つからず困っています。例えば

curl http://www.google.com > /dev/null 2>&1 &

  68  Matt Huggins  2009-11-16


ベストアンサー

1 は標準出力 (stdout) を示す。2 は標準エラー (stderr) を示す

つまり、2>&1は標準出力がリダイレクトされているところに標準エラーを送るように言っているのです。これは /dev/null に送られているので、出力を全く無視しているのと同じことになります

83  Chealion  2009-11-16


tl;dr

backgroundにあるhttp://www.google.comを取得し、stdoutstderrの両方を破棄する

curl http://www.google.com > /dev/null 2>&1 &

と同じです

curl http://www.google.com > /dev/null 2>/dev/null &

Basics

012は、POSIX オペレーティングシステムにおける標準ファイルディスクリプタを表しています。ファイルディスクリプタは、(基本的に) ファイルや ソケット へのシステム参照です

C言語で新しいファイル記述子を作成すると、次のようになります

fd = open("data.dat", O_RDONLY)

ほとんどのUnixシステムのコマンドは、何らかの入力を受けてその結果をターミナルに出力します。curl は指定された url (google dot com) にあるものは何でも取得し、その結果を stdout に表示します

curl result

Redirection

あなたが言ったように、<>はコマンドからの出力をファイルのような別の場所にリダイレクトするために使われます

例えば、ls > myfiles.txtでは、lsはカレントディレクトリの内容を取得し、>はその出力をmyfiles.txtにリダイレクトします(ファイルが存在しない場合は作成され、そうでなければ上書きされますが、代わりに>の代わりに>>を使ってファイルに追加することもできます)。上記のコマンドを実行すると、ターミナルに何も表示されないことに気づくでしょう。これは通常、Unix システムでは成功を意味します。これを確認するには、cat myfiles.txtでファイルの内容を画面に表示します

> /dev/null 2>&1

最初の部分 > /dev/nullstdout、つまり curl の出力を /dev/null にリダイレクトし、2>&1stderrstdout にリダイレクトします (これは /dev/null にリダイレクトされたばかりなので、すべてが /dev/null に送られることになります)

2>&1の左側は何がリダイレクトされるかを示し、右側はどこにリダイレクトされるかを示します。&stdout (1)stderr (2)12という名前のファイルを区別するために右側で使われています。つまり、2>1は、1という名前の新しいファイルを(まだ存在していなければ)作成し、stderrの結果をそこにダンプすることになります

/dev/null

/dev/nullは空のファイルであり、そこに書き込まれたものをすべて破棄するために使われる仕組みです。つまり、curl http://www.google.com > /dev/nullcurlの出力を効果的に抑制していることになります

> /dev/null

しかし、ターミナルに表示されたままのものがあるのはなぜだろうか。これはcurlの通常の出力ではなく、stderrに送られたデータで、ここではエラーだけでなく進捗状況や診断情報を表示するために使われています

curl http://www.google.com > /dev/null 2>&1curlの出力とcurlの進行情報の両方を無視します。その結果、端末には何も表示されません

Finally

最後の & は、ジョブ として、バックグラウンド でコマンドを実行するようシェルに指示する方法です。これにより、プロンプトがすぐに戻り、コマンドは舞台裏で非同期的に実行されます。現在のジョブを見るには、ターミナルで jobs と入力してください。これは システムで実行されているプロセスとは異なることに注意してくださいこれらのプロセスを見るには、ターミナルで top と入力してください

References

31  Jorge Bucaran  2014-11-30


2はSTDERRを参照します。2>&11(STDOUT)と同じ場所にSTDERRを送ります

5  John T  2009-11-16


以下のように理解しています

コマンドの出力情報とエラー情報を画面上で読みたいだけならば、ただ書けばいい。curl http://www.google.com

また、出力情報をターミナル画面ではなくファイルに保存して後で確認したい場合は、以下のように書きます。curl http://www.google.com > logfile

しかし、この方法では、>はStdOutをlogfileにリダイレクトするだけなので、StdErrの情報は省略されます

そのため、一度実行に失敗したコマンドのエラー情報を気にするのであれば、2>&1でStdOutとStdErrを組み合わせる必要があります(つまり、StdErrをStdOutに畳み込む)ので、以下のようなコマンドラインを書くことができます。curl http://www.google.com > logfile 2>&1

0  YaOzI  2013-12-06


タイトルとURLをコピーしました