Bash

為什麼bash設置$?(退出狀態)在 Ctrl-C 或 Ctrl-Z 上非零?

  • June 8, 2020

從 bash 手冊中,關於$?變數

$?擴展到最近執行的前台管道的退出狀態。

我想知道為什麼 bash 會$?在按下Ctrl-Cor時更新變數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 ();
 }

並在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找到。

引用自:https://unix.stackexchange.com/questions/251996