だから私はセグフォルトをすることもできないかもしれないプログラムを持っています(./セグフ) は stderr に追加データも書き込みます。プログラムで分割エラーが発生した場合、戻りコードは139です(つまり、echo $?
印刷されます139
)。
印刷を避けるためにstderrをリダイレクトしたいのですが、/dev/null
そうすると./segf 2>1
戻りコードが1に設定されます。これで、プログラムが実際にsegfaultを引き起こしているのかエラーだけを返すのかはわかりません。
戻りコードが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
)実行しようとすると文書呼び出しは1
stderrを次にリダイレクトします。ファイルを生成できない場合は、終了ステータスが表示されます1
。
$ foo.sh 2>1; echo $?
bash: 1: Permission denied
1