コマンドまたはシェルスクリプトの出力がstdoutかstderrかどうかを確認する方法

コマンドまたはシェルスクリプトの出力がstdoutかstderrかどうかを確認する方法

コマンドやシェルスクリプトを実行すると出力が出るとしましょう。このコマンドやシェルスクリプトの内部内容について何も知らない状態で、出力が出力されているかどうかをstderrどうやって確認できますかstdout

例えば、

$ ls -ld /
drwxrwxr-t  35 root  admin  1258 Dec 11 19:16 /

比較済み

ls -ld /test
ls: /test: No such file or directory

stdout最初のコマンドがに印刷され、2番目のコマンドがstderr(そうですか?)に印刷されているかどうかを確認できますか?

答え1

出力が印刷されたかどうかを知る方法はありません。この場合stdoutと両方がstderr端末に接続されているため、テキストが端末に表示されるまでどのストリームに書き込まれたかに関する情報は、端末に到達する前にプログラムによってまとめられます。

上記の場合は、コマンドを実行しstdoutstderr別の場所にリダイレクトして何が起こるかを確認できます。またはstdout、リダイレクトを使用して1回、リダイレクトを/dev/null使用して1回、2回実行し、どのような場合にテキストが表示されるかを確認します。stderr/dev/null

コマンドラインの末尾に追加してリダイレクトすることもstdout、追加してリダイレクトすることもできます。/dev/null>/dev/nullstderr/dev/null2>/dev/null

答え2

リダイレクトstdoutを使用> fileし、リダイレクトstderrを使用できます2> file。多くの最新のシェルはコマンドへのリダイレクトをサポートしているため、sedどの出力がどのストリームから出力されるのかを強調することができます。

$ ls 2> >(sed 's/^/2: /') > >(sed 's/^/1: /')
1: unity_support_test.0
1: vmwareDnD

$ ls foo 2> >(sed 's/^/2: /') > >(sed 's/^/1: /')
2: ls: cannot access foo: No such file or directory

答え3

annotate-outputDebian のスクリプトdevscriptsオプションで、次のことができます。

$ annotate-output ls -ld /test
14:54:22 -: Started ls -ld /test
14:54:22 E: ls: cannot access /test: No such file or directory
14:54:22 -: Finished with exitcode 2

2番目の列は、それぞれOstdoutとstderrを使用して表しますE

いくつかの注意事項がありますが、最も重要なことは他の答えに記載されているようです。実際には、これを行うことはできません。シェルまたは端末はプログラムがファイル記述子をどのように使用するかを知りませんが、シェルは最初にファイル記述子を設定する必要があります。

この方法はfifoを使用し、fifoへの書き込みはttyへの書き込みとは異なる動作をし、2つの異なるfifoへの書き込みは間違いなく異なります(潜在的なタイミング/インターリーブの問題)。また、インタラクティブな使用には適していません。たとえば、これはannotate-output bashあまり良い計画ではありませんが、他の多くの目的には便利です。 stdin/stdout/stderr 色付けに関連する問題に関して、スクリプトとシェル関数の例は非常に多くあります。最も強力なことは次のとおりです。標準的な美徳これは、プログラムの(ほとんど)ランタイム修正を使用してstderrに書き込まれたデータを変更します。

Ankoがリンクしたこの質問には、関連トピックに関する良い回答があります。Colorizing stdout / stderr出力: STDERRとSTDOUTを異なる色で印刷するようにシェルを設定できますか?

答え4

通常、STDERR はメッセージの前にプログラム名の前にコロンを追加します。

例:

rpm -zq some_utils 
rpm: -zq: unknown option

VS

rpm -ql some_utils 
package some_utils is not installed

関連情報