コマンドやシェルスクリプトを実行すると出力が出るとしましょう。このコマンドやシェルスクリプトの内部内容について何も知らない状態で、出力が出力されているかどうかを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
端末に接続されているため、テキストが端末に表示されるまでどのストリームに書き込まれたかに関する情報は、端末に到達する前にプログラムによってまとめられます。
上記の場合は、コマンドを実行しstdout
てstderr
別の場所にリダイレクトして何が起こるかを確認できます。またはstdout
、リダイレクトを使用して1回、リダイレクトを/dev/null
使用して1回、2回実行し、どのような場合にテキストが表示されるかを確認します。stderr
/dev/null
コマンドラインの末尾に追加してリダイレクトすることもstdout
、追加してリダイレクトすることもできます。/dev/null
>/dev/null
stderr
/dev/null
2>/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-output
Debian のスクリプト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番目の列は、それぞれO
stdoutと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