つまり、セグメント違反を起こすかもしれないし起こさないかもしれないプログラムがある(./セグメンテーション) は、他のデータも stderr に書き込みます。プログラムがセグメント フォールトになると、戻りコードは 139 になります (つまり、 がecho $?
出力されます139
)。
stderr を にリダイレクトして/dev/null
印刷を避けたいのですが、そうすると ( ./segf 2>1
)、戻りコードが 1 に設定されます。これでは、プログラムが本当にセグメント違反を起こしているのか、単にエラーを返しているのかを区別することは不可能です。
戻りコードが 139 であることを確認できる状態で、stderr の他のエラーをパイプすることは可能ですか?
./segf >/dev/null; echo $?
結果は139件
./segf >/dev/null 2>1; echo $?
結果 1
bash -c './segf'
結果は139件
bash -c './segf' 2>1
結果 1
答え1
試したことはどれも終了ステータスに影響を与えません。次の非常に簡単なスクリプトでテストできます。
#!/bin/sh
echo out
echo err >&2
exit 139
次に、さまざまなリダイレクトを使用して実行します。
$ foo.sh; echo $?
out
err
139
#redirect stdout to /dev/null and stderr to a file called '1'
$ foo.sh >/dev/null 2>1; echo $?
139
## Redirect stderr to /dev/null
$ foo.sh 2>/dev/null; echo $?
out
139
コマンドのstderrをリダイレクトする方法は だけですcommand 2>/dev/null
が、リダイレクトが失敗しない限り、コマンドの終了ステータスに影響を与えることはありません。これはおそらくあなたのケースで実際に起こったことです。あなたが現在いるディレクトリに書き込み権限がなく、./segf >/dev/null 2>1
の代わりにを実行しようとした場合./segf >/dev/null 2>&1
、それは作成しようとします。ファイルstderr をリダイレクトするために呼び出されます1
。ファイルを作成できない場合は、次の終了ステータスが返されます1
。
$ foo.sh 2>1; echo $?
bash: 1: Permission denied
1