簡體   English   中英

如何在Linux POSIX shell腳本中捕獲CTRL + Z; 可能與否?

[英]How to trap CTRL+Z in Linux POSIX shell script; possible or not?

我是一名Linux Shell腳本編寫者,我想知道是否可以trap信號以進行腳本睡眠

那是Ctrl + z

我目前正在這樣做,並且也想捕獲該睡眠信號。

# define functions to handle signals
# treat them as errors with appropriate messages
sighup()   {  print_error_and_exit "trap()" "Caught SIGHUP (1). Terminating. Bye!";    }
sigint()   {  print_error_and_exit "trap()" "Caught SIGINT (2). Terminating. Bye!";    }
sigquit()  {  print_error_and_exit "trap()" "Caught SIGQUIT (3). Terminating. Bye!";   }
sigabrt()  {  print_error_and_exit "trap()" "Caught SIGABRT (6). Terminating. Bye!";   }
sigterm()  {  print_error_and_exit "trap()" "Caught SIGTERM (15). Terminating. Bye!";  }

# use the above functions as signal handlers;
# note that the SIG* constants are undefined in POSIX,
# and numbers are to be used for the signals instead
trap 'sighup' 1; trap 'sigint' 2; trap 'sigquit' 3; trap 'sigabrt' 6; trap 'sigterm' 15

如其名稱所示, print_error_and_exit函數僅在其中print_error_and_exit


目標:如果在終端上鍵入,我想忽略此信號(顯然,這很重要)。

要忽略從終端鍵入的Ctrl + Z ,可以執行以下操作:

trap '' TSTP

# or possibly equivalently
trap '' 18
trap '' 20
trap '' 24

正如其他人所指出的那樣,還有其他一些無法阻止的信號,例如SIGKILL和SIGSTOP。

許多shell將Ctrl + \\映射到SIGKILL,將Ctrl + C映射到SIGINT。

stty -a應該顯示用於發送“ susp”(SIGTSTP),“ intr”(SIGINT)和“ quit”(SIGKILL)的設置。 如果需要,這些擊鍵可由用戶反彈。

編者注

  • 您不能在POSIX Shell腳本中使用SIGTSTP假名。

  • 即使你確信你的終端發送什么確切的信號數,如果寫一個通用的腳本,你應該阻止所有三種可能性。

  • ShellCheck警告,我引用:

     Trapping signals by number is not well defined. Prefer signal names. [SC2172] 

    意味着這些信號號在平台之間可能會有所不同,對於SIGTERM嘗試15,您將完全看不到任何警告,因為這是POSIX標准化的。 如此,您可能需要在使用以下代碼測試代碼后將其禁用:

     # shellcheck disable=SC2172 

    鏈接至Wiki: https : //github.com/koalaman/shellcheck/wiki/SC2172

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM