Как перехватывать CTRL+Z в скрипте Linux POSIX; возможно или нет?
Я сценарист оболочки Linux, я хотел бы знать, если это возможно 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
Функция просто делает, как говорит ее название.
Цель: я хотел бы игнорировать этот сигнал, если он набран на терминале (очевидно, это имеет значение).
1 ответ
Чтобы игнорировать Ctrl+Z, набранные с терминала, вы можете сделать:
trap '' TSTP
# or possibly equivalently
trap '' 18
trap '' 20
trap '' 24
Как отмечают другие, существуют другие сигналы, которые нельзя заблокировать, такие как SIGKILL и SIGSTOP.
Многие оболочки отображают Ctrl+\ в SIGKILL и Ctrl+C в SIGINT.
stty -a
должны показывать настройки для отправки "susp" (SIGTSTP), "intr" (SIGINT) и "quit" (SIGKILL). Эти нажатия клавиш могут быть восстановлены пользователем при желании.
Примечания редактора:
Вы не можете использовать
SIGTSTP
псевдоним в сценарии оболочки POSIX.Даже если вы точно знаете, какой точный номер сигнала посылает ваш терминал, при написании сценария для общего пользования вы должны заблокировать все эти три возможности.
Предупреждение ShellCheck, и я цитирую:
Trapping signals by number is not well defined. Prefer signal names. [SC2172]
Значит, эти номера сигналов могут различаться для разных платформ, попробуйте 15 для SIGTERM, и вы вообще не увидите никаких предупреждений, так как это стандарт POSIX. Ergo, возможно, вы захотите отключить их после того, как протестировали свой код с помощью:
# shellcheck disable=SC2172
Ссылка на вики: https://github.com/koalaman/shellcheck/wiki/SC2172