/ dev / stderrと>&2への出力の送信


11

スクリプトでは、エラーは通常、を使用してファイル記述子2に送信されます&2。つまり、

echo "error" >&2

時には/dev/stderr代わりに使用されます:

echo "error" > /dev/stderr 

見て/dev/stderr、私はそれが唯一のシンボリックリンクであることがわかり/proc/self/fd/2順番にへのシンボリックリンクである、/dev/pts/5(私の現在の端末上)。

少し複雑に見えます。その背後にいくつかのロジックがありますか?

を使用/dev/stderrして&2同等ですか?

他のものよりも好ましいものはありますか?


3
echo "error" >2名前2と内容を含むファイルを作成しますerror
Cyrus


私の編集が2ではなく&2で再導入されているのがわかります。あなたの質問は、実際に>2、またはの使用について>&2ですか?
ジェフシャラー

回答:


13

特殊デバイス/dev/stderrはシステム固有であり、ファイル記述子2(特殊デバイスで/proc/self/fd/2はない)は移植可能です。移植性のないコードを記述したい場合は、これらの特別なデバイスから始めるとよいでしょう。

いくつかのシステムがあります/dev/stderr:もちろんLinuxとOSXです。しかし、OSXには/procファイルシステムがなく、それ/dev/stderrはへのリンク/dev/fd/2です。

参考文献:


また、誰かがやりたい場合もあります。これ2> bla.logは、パイプし2てハードコードしない限り機能します/dev/stderr。基本的に2はありません必要であることをstderr出力します。
larkey 16

6

bashやその他のシェルでは、何か標準エラーにリダイレクトする方法はを使用すること>&2です。bash /dev/stderrファイル記述子 として開きます2。ファイルディスクリプタはによって参照されている&N場所Nの記述子の数です。だから、echo error >&2印刷されるerrorまで、標準エラーに/dev/stderr

また/dev/stdout、ファイル記述子として開きます1。これはあなたができることを意味しますecho output >&1。ただし、デフォルトではすべてが標準出力に出力されるためecho output、それ自体と同じです。

今、2>違います。ここでは、コマンドのエラー出力を別の場所にリダイレクトしています。つまり、2>file「ファイル記述子2(標準エラー)に出力されたものをすべてリダイレクトする」という意味fileです。


3

あなたは正しい、>&2より直接的で完全に「慣用的」です。これらは同等である必要があるため、を使用する特別な理由はありません>/dev/stderr。それを除いて、誰かがこれらが何をするかを知らない場合、それらのうちの1つはおそらく他のものより見つけるのが簡単です:-)。ただし、一般的にはを使用することをお勧めします>&2

/ dev / stderrは、プログラムが指定されたファイル名にエラーを書き込むが、stderrをサポートしない場合に役立ちます。明らかにこれは少し工夫されています。/ dev / stdoutの方がはるかに便利です。(mysql_safeラッパースクリプトがコンソールにエラーを書き込まないことが最近わかりました。残念ながら、エラーログファイルのアクセス許可も変更する必要があるため、/ dev / stderrを使用すると、いくつかの余分な警告が表示されます)。

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