Как перехватывать CTRL + Z в скрипте Linux POSIX;возможно или нет? - PullRequest
0 голосов
/ 10 февраля 2019

Я сценарист оболочки 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 Ответ

0 голосов
/ 11 февраля 2019

Чтобы игнорировать 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.Возможно, вы захотите отключить их после того, как протестировали свой код с помощью:

    # shellcheck disable=SC2172
    

    Ссылка на вики: https://github.com/koalaman/shellcheck/wiki/SC2172

...