如何在 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
函数正如其名。
目标:我想忽略这个信号,如果在终端上输入的话(显然这很重要)。
要忽略从终端输入的 Ctrl+Z,您可以执行以下操作:
trap '' TSTP
# or possibly equivalently
trap '' 18
trap '' 20
trap '' 24
正如其他人所指出的,还有其他信号无法阻止,例如 SIGKILL 和 SIGSTOP。
许多 shells 映射 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
Link 至 wiki:https://github.com/koalaman/shellcheck/wiki/SC2172
我是一名 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。
许多 shells 映射 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
Link 至 wiki:https://github.com/koalaman/shellcheck/wiki/SC2172