エラーがない限り、出力なしでバックグラウンドでコマンドを実行する方法


14

コマンドの出力を抑制し、コマンド終了でエラーがコード化された場合に表示する方法

回答:


17

残念ながら、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 &(末尾&が原因でバックグラウンドで実行される)

これは、元の終了コードを飲み込むだろう、との両方をダンプすることに注意してくださいstdoutstderr障害が発生した場合に。必要に応じてカスタマイズできます。


1エラー出力が表示されないという保証すらありませんstdout-一部のプログラムはそこにすべての出力をダンプします!

2残念ながら、これは常に当てはまるわけではありません。終了コードはプログラムによって完全に制御されており、ゼロ以外の終了を伴う成功条件を示すものもあります。再度、マニュアルを確認してください。


ちょっとした魚の微調整、〜/ .config / fish / functions /に関数を置く特別な場所があります
Xster

12

Unixユーティリティはに一般メッセージを送信しstdout、エラーメッセージをstderrに送信するため、エラーメッセージのみを表示したい場合は、コンソールに出力を表示するstdoutだけで十分stderrです。

(との両方bashfish)これを行う方法は>/dev/null、コマンドに追加することです。これはstdoutを空にしますが、stderr(エラーメッセージを含む)は引き続きコンソールに到達します。

したがって、たとえば:

echo 1 >/dev/null通常のstdout出力が抑制され、stderrには何も書き込まれないため、コマンドは何も出力しません。

man doesnotexist >/dev/nullエラーメッセージをにman書き込むため、コマンドはエラーメッセージを出力しますstderr


2

これは、バックグラウンドでコマンドを実行し、通常の出力を無視しながらエラーをログファイルに書き込みます

    command > /dev/null 2> /tmp/example_error.log &
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.