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

时间:2019-02-10 05:05:48

标签: linux signals sh posix trap

我是Linux shell脚本编写者,我想知道是否有可能 methods: { getSrc(src) { return require("../assets/" + src); } } 发出 script sleep 信号:

Ctrl + z 吗?

我现在正在这样做,并且也想捕获睡眠信号。

trap

# 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 函数的作用恰如其名。


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

1 个答案:

答案 0 :(得分:1)

要忽略从终端键入的 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