スクリプトでは、エラーは通常ファイル記述子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を使用すると重複した警告が発生します。)