如何在Linux POSIX shell脚本中捕获CTRL+Z;是否可能



我是一名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函数的作用正如其名称所示。


目标:如果在终端上键入,我希望忽略此信号(显然这很重要)。

要忽略从终端键入的Ctrl+Z,可以执行:

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

正如其他人所指出的,还有其他信号不能被阻止,比如SIGKILL和SIGSTOP。

许多shell将Ctrl+\映射到SIGKILL,将Ctrl+

Cstty -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

相关内容

最新更新