bashが$を設定するのはなぜですか? (終了ステータス) が Ctrl-C または Ctrl-Z ではゼロではないのですか?

bashが$を設定するのはなぜですか? (終了ステータス) が Ctrl-C または Ctrl-Z ではゼロではないのですか?

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 ();
  }

そして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} 変数をご覧ください。

関連情報