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)を加えて設定します。

おすすめ記事