Bash
為什麼bash設置$?(退出狀態)在 Ctrl-C 或 Ctrl-Z 上非零?
從 bash 手冊中,關於
$?
變數:
$?
擴展到最近執行的前台管道的退出狀態。我想知道為什麼 bash 會
$?
在按下Ctrl-C
or時更新變數Ctrl-Z
:$ echo $? 0 $ ^C $ echo $? 130 $ sleep 10 ^Z [1]+ Stopped sleep 10 $ echo $? 148
當您
Ctrl+C
在命令行上按下時,什麼都不會退出,但是SIGINT
(sigint_sighandler()
) 的處理程序將退出狀態設置為 130 (128 + 2,正如 DopeGhoti 的回答所解釋的那樣):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
以終止後台程序時,shell 會觀察到該程序已終止,並將退出狀態設置$?
為 128 加上信號號。當您按下
Ctrl+Z
暫停後台程序時,shell 會觀察到該程序發生了什麼事:它並沒有死亡,但資訊是通過相同的系統呼叫(wait
和朋友)報告的。同樣,shell 將退出狀態設置$?
為 128 加上信號編號,即 148 (SIGTSTP = 20)。
因為
0
是正常退出狀態的退出程式碼。攔截中斷或中斷信號不是通常的退出狀態,也不是被掛起到後台。非零退出程式碼告訴您這是正在發生的事情,以便您可以在腳本中做出相應的反應,如果它觸發的作業被終止或暫停,而不是按正常以非錯誤狀態退出。
互動式 shell 會話,當您按下 時
^``C
,會拋出一個SIGINT
信號(信號 2),中止目前互動式命令條目,這是命令條目(即命令提示符)處於的非正常狀態。這會導致它返回狀態130(128+2),並給你一個新的提示。更多細節可以在http://tldp.org/LDP/abs/html/exitcodes.html#EXITCODESREF找到。