>&2 を使用して出力を /dev/stderr に送信します。

>&2 を使用して出力を /dev/stderr に送信します。

スクリプトでは、エラーは通常ファイル記述子2に送信されます&2。つまり、次のようになります。

echo "error" >&2

時には/dev/stderr次のように使用されます。

echo "error" > /dev/stderr 

を見ると/dev/stderrのシンボリックリンクだけですが(現在端末では)の/proc/self/fd/2シンボリックリンクであることがわかります。/dev/pts/5

少し複雑すぎるようです。これの背後にはどんな論理がありますか?

using/dev/stderr&2同等ですか?

どちらか一方が他よりも優先されますか?

答え1

特殊デバイス/dev/stderrはシステムによって異なりますが、ファイル記述子2(特殊デバイスではありません/proc/self/fd/2)は移植可能です。移植不可能なコードを書くには、これらの特別なデバイスを使用することをお勧めします。

次のシステムが提供されます/dev/stderr。もちろん、Linuxも含まれます。OSX。ただし、OSXには/procファイルシステムは/dev/stderrありません/dev/fd/2

追加資料:

答え2

Bashや他のシェルから何かをリダイレクトする方法到着Bashを使用して標準エラーが>&2開きます。/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。それ以外は、読者が自分のやり方を知らない場合は、他のものよりも探しやすくなります。しかし、一般的に言えば>&2

/ dev / stderrは、プログラムが指定されたファイル名にエラーを記録しますが、stderrをサポートしていない場合に便利です。明らかに、これは少し考案されたものです。 /dev/stdout がより便利です。 (最近mysql_safeラッパースクリプトがコンソールにエラーを記録しないことがわかりました。残念ながら、エラーログファイルの権限も変更しようとしているため、/ dev / stderrを使用すると重複した警告が発生します。)

関連情報