コマンドラインで「2>&1」は何をしますか?


59

>コマンドラインで出力リダイレクトに記号が使用されることは知っていますが、コマンドラインでの使用を説明する何かを見つけるのに苦労しています2>&1。例えば:

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

回答:


78

1表し、標準出力(stdout)。2意味標準エラー(stderrを)。

したがって2>&1、標準出力がリダイレクトされる場所にも標準エラーを送信するように指示します。送信されるので/dev/null、出力をまったく無視することに似ています。


2
アンパサンドが1の前に表示され、2の前には表示されない理由はありますか?&はバックグラウンドでジョブを実行するための予約文字であると思っていましたが、コマンドの最後にアンパサンドが長い文字として表示される場合のみだと思います...?
マットハギンズ

8
ので0(STDIN)、1(STDOUT)と2(標準エラー出力)が、実際にファイルディスクリプタているシェルはリダイレクトに彼らの前に置かアンパサンドが必要です。この場合、ファイル記述子を複製し、2つの情報ストリームを効果的にマージします。
Chealion

12
このように考えてください。アンパサンドなしで「1」があった場合、シェルは「1」という名前のファイルを作成し、stderr出力をそれにリダイレクトします。
CarlF 2009年

1
さて、これだけで有効ですか?curl http://www.google.com 2>/dev/nullここの「2」はstderrを意味するものであり、curlコマンドに渡す2番目のパラメーターではないことをコマンドラインはどのように認識しますか?
マットハギンズ

1
@Matt Huggins:はい。これにより、すべての出力がstderrストレートから/dev/null代わりに送信されます。あなたは試みることによって、実際にそれを見ることができるcurlcurl 1>/dev/nullcurl 2>/dev/nullだけ出力の変化を見るために。繰り返しますが、アンパサンドはリダイレクトされるファイル記述子にのみ必要です。
Chealion

23

tl; dr

バックグラウンドでフェッチhttp://www.google.comし、との両方を破棄します。stdoutstderr

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

と同じです

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

基礎

01および2標準のファイルを表す記述子POSIXのオペレーティングシステムを。ファイル記述子は、(基本的に)ファイルまたはソケットへのシステム参照です。

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

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

ほとんどのUnixシステムコマンドは、入力を受け取り、結果を端末に出力します。curl指定されたurl(google dot com)にあるものをすべて取得し、結果をに表示しstdoutます。

カール結果

リダイレクション

あなたのように言った<>どこかに、ファイルのようにコマンドの出力をリダイレクトするために使用されています。

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

> / dev / null 2>&1

最初の部分はを> /dev/nullリダイレクトしますstdout。これはcurlの出力です/dev/null(これについては先に説明します)に2>&1リダイレクトstderrしますstdout(リダイレクトされた/dev/nullので、すべてが送信されます/dev/null)。

左側が2>&1わかりますどのようなリダイレクトされ、右側がわかりますどこに。&区別するために右側に使用されているstdout (1)か、stderr (2)指定されたファイルから12。その2>1ため、新しいファイル(まだ存在しない場合)を作成して1stderr結果をそこにダンプします。

/ dev / null

/dev/nullは空のファイルで、書き込まれたものをすべて破棄するために使用されるメカニズムです。したがって、 の出力をcurl http://www.google.com > /dev/null効果的に抑制していcurlます。

> / dev / null

しかし、なぜ端末に表示されるものがあるのですか?これは通常の出力ではなく curl、に送信されるデータでありstderr、ここではエラーだけでなく進行状況と診断情報を表示するために使用されます。

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

最後に

&最後には、あなたのようにコマンドを実行するためにシェルを伝える方法です仕事背景。これにより、コマンドがバックグラウンドで非同期に実行されている間、プロンプトがすぐに戻ります。現在のジョブを確認するにjobsは、ターミナルに入力します。これは、システムで実行されているプロセスとは異なることに注意してください。topターミナルでこれらのタイプを表示するには。

参照資料


1
これは、レイアウトの観点から見たウェブサイト全体のベストアンサーの1つです。
OmarOthman

私が得ていないことの1つは、あなたがすべてを送りたい理由です/dev/nullcurl少なくともどこかでの結果が役に立つと思いませんか?
skube

@skubeそう。この場合、ユーザーがstdoutとstderrの両方を破棄したい理由は明確ではありません。OPはおそらく、構文の意味を理解したかっただけです。
ホルヘブカラン


0

私は次のように理解しています:

画面上のコマンドの出力およびエラー情報のみを読み取りたい場合は、次のように記述します。 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 > logfile2>&1

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