web-dev-qa-db-ja.com

「セグメンテーション違反」メッセージはSTDERRの下にありますか?

bashで実行可能ファイルを実行しました

_./code > log
_

すべてのprintfステートメントがログファイルに記録されるのに対し、ターミナルには時々エラーメッセージが表示されます。以下のように再実行します

_./code >& log
_

現在は、時々発生するエラーメッセージもログに記録されます。ただし、セグメンテーション違反がある場合でも、ターミナルに表示されます。どうして?メッセージSegmentation fault (core dumped)をログファイルに入れる方法は?


user $ bash --version

GNU bash、バージョン4.2.24(1)-release(i686-pc-linux-gnu)

19
user13107

セグメンテーション違反はシグナルであり、これをキャッチしない場合、プログラムは終了し、シェルはこれを(プログラムのstderrではなく)stderrに出力します。

これが発生すると、プログラムがシグナルをキャッチするか、シェルがSIGCHILDシグナルをトラップして子の終了ステータスをチェックすることにより、プログラムまたはシェルが特定のアクションを実行する可能性があります。

16
cjh

「セグメンテーション違反」メッセージがstderrに出力されますが、これはシェルの標準エラーであり、プログラムの標準エラーではありません。シェルは、シグナルが原因でプログラムが終了したことを検出すると、このメッセージを出力します。

プログラムを実行するシェルスクリプトの一部をstderrにリダイレクトすることで、メッセージを消音にできます。

{ ./code; } >&log