bash マニュアルでは、$?
変える:
$?
最後に実行された前景パイプの終了状態に展開されます。
$?
または、キーを押したときにbashがCtrl-C
変数を更新する理由を知りたいですCtrl-Z
。
$ echo $?
0
$ ^C
$ echo $?
130
$ sleep 10
^Z
[1]+ Stopped sleep 10
$ echo $?
148
答え1
コマンドラインを押すと、Ctrl+C何も終了しませんがSIGINT
(のハンドラが表示されます)。sigint_sighandler()
) とにかく終了状態を130に設定します(DopeGhotiの回答で説明されているように128 + 2).
if (interrupt_immediately)
{
interrupt_immediately = 0;
last_command_exit_value = 128 + sig;
throw_to_top_level ();
}
if (interrupt_state)
{
if (last_command_exit_value < 128)
last_command_exit_value = 128 + SIGINT;
print_newline = 1;
DELINTERRUPT;
}
バックグラウンドプロセスの終了を押すと、Ctrl+Cシェルはプロセスの終了を観察し、終了ステータスを$?
128にシグナル番号を加えた値に設定します。
バックグラウンドプロセスを一時停止すると、Ctrl+Zシェルはプロセスに何が起こるかを観察します。まだ死んでいませんが、wait
同じシステムコール(および友人)を介してその情報を報告します。同様に、シェルは終了ステータスを$?
128に信号番号148(SIGTSTP = 20)を加えて設定します。
答え2
0
正常な終了状態の終了コードだからです。
割り込みや割り込み信号を傍受することは通常のシャットダウン状態ではなく、バックグラウンドで中断されません。ゼロ以外の終了コードは、エラーではなく通常の方法で終了するのではなく、スクリプトによってトリガーされたジョブが終了または中断されたときにスクリプトが適切に対応できるように何が起こっているのかを示します。
対話型シェルセッションでを押すと、シグナル(信号2)が^C発生し、SIGINT
現在の対話型コマンドエントリが中断されます。これはコマンドエントリ(コマンドプロンプトなど)の異常な状態です。その後、ステータス130(128 + 2)が返され、新しいプロンプトが表示されます。
詳細については、次を参照してください。http://tldp.org/LDP/abs/html/exitcodes.html#EXITCODESREF。
答え3
$?
標準には受信信号の値がと記載されていますが、> 128
これを行う方法は標準には記載されていません。
Bourne Shellが信号を設定する場合は、$?
次を使用します。128 + signal number
ksh93を使う256 + signal number
信号1、2、3、6、9、14、15のみ移植可能です。
つまり、SIGTSTPとSIGSTOPは移植できない番号を使用します。
この目的のために、Bourne Shellは最近新しいポータブルシステムをリリースしました。http://schillix.sourceforge.net/man/man1/bosh.1.html${.sh.termsig} 変数をご覧ください。