回答:
残念ながら、stderr
エラー出力にのみ使用される仮定は常に正しいとは限りません。むしろ、stderr
多くの場合、すべてのインタラクティブな出力および診断、つまり、ユーザーがインタラクティブプロンプト1を読み取ることを目的とした出力に使用されます。wget
そしてdd
、よく知られた例です。
一部のコマンドは、エラー以外の出力を抑制するフラグ(-quiet
または-silent
)を提供します-マニュアルページを読んで、存在するかどうかを確認します。
より頻繁に保持されるもう1つの規則は終了コードです。プログラムは、終了時に終了コードを返します。通常、2の終了コード0
は成功を示し、他の終了コードはエラーを示します。
を使用するbash
と、$?
変数から最後のコマンドの終了コードを取得できます。ではfish
、$status
変数を使用します。stderr
一時ファイルにパイプして、エラーが発生した場合にのみ印刷できます。例(fish
):
command 2>/tmp/outputbuffer
if $status
cat /tmp/outputbuffer
rm /tmp/outputbuffer
コマンドを連鎖させない場合は、いくつかのショートカットを使用することもできます。
if command 2>/tmp/outputbuffer
cat /tmp/outputbuffer
rm /tmp/outputbuffer
または:
command 2>/tmp/outputbuffer; or cat /tmp/outputbuffer; rm /tmp/outputbuffer;
stdout
を使用して、同じバッファにパイプすることもでき2>&1 >/tmp/outputbuffer
ます。
(注:私は実際には知らないfish
ので、ドキュメントで見つけることができるものに概念を適合させています。構文が少し間違っているかもしれません。また、mktemp
一意の一時ファイルを生成するために使用できます。変数のファイル名。)
同時にインタラクティブに使用しているシェルのバックグラウンドですべてを実行する必要がある場合は、出力を処理するスクリプトを記述して、標準の手法でバックグラウンドでそのスクリプトを実行することをお勧めします(fish
)。ちなみに、次の関数のようなものをに入れることができます~/.config/fish/config.fish
:
function run-silent
set temp (mktemp)
if $argv 2>&1 >$temp
cat $temp
rm $temp
end
で呼び出すrun-silent somecommand &
(末尾&
が原因でバックグラウンドで実行される)
これは、元の終了コードを飲み込むだろう、との両方をダンプすることに注意してくださいstdout
とstderr
障害が発生した場合に。必要に応じてカスタマイズできます。
1エラー出力が表示されないという保証すらありませんstdout
-一部のプログラムはそこにすべての出力をダンプします!
2残念ながら、これは常に当てはまるわけではありません。終了コードはプログラムによって完全に制御されており、ゼロ以外の終了を伴う成功条件を示すものもあります。再度、マニュアルを確認してください。
Unixユーティリティはに一般メッセージを送信しstdout
、エラーメッセージをstderr
に送信するため、エラーメッセージのみを表示したい場合は、コンソールに出力を表示するstdout
だけで十分stderr
です。
(との両方bash
でfish
)これを行う方法は>/dev/null
、コマンドに追加することです。これはstdoutを空にしますが、stderr(エラーメッセージを含む)は引き続きコンソールに到達します。
したがって、たとえば:
echo 1 >/dev/null
通常のstdout
出力が抑制され、stderrには何も書き込まれないため、コマンドは何も出力しません。
man doesnotexist >/dev/null
エラーメッセージをにman
書き込むため、コマンドはエラーメッセージを出力しますstderr
。