[英]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.