Как настроить привязку клавиш для отправки SIGKILL
на текущее задание переднего плана?
Я уже знаю, что Ctrl+C - SIGINT
а Ctrl+\ - SIGQUIT
. Я хотел бы более серьезный вариант.
Есть ли что-то серьезно нежелательное в этом?
Как настроить привязку клавиш для отправки SIGKILL
на текущее задание переднего плана?
Я уже знаю, что Ctrl+C - SIGINT
а Ctrl+\ - SIGQUIT
. Я хотел бы более серьезный вариант.
Есть ли что-то серьезно нежелательное в этом?
Нежелательно или нет, на самом деле это невозможно:
Контроль +[?] На самом деле привязки клавиш обрабатываются драйвером tty, а не оболочкой, поскольку до тех пор, пока на переднем плане запущен процесс, ввод и вывод вашего терминала будут перенаправляться непосредственно процессу. Оболочка никогда не сможет воздействовать (или даже видеть) ваши нажатия клавиш.
Вы можете получить список назначенных в данный момент Ctrl+[?] комбинации клавиш из stty -a
; однако, только intr
(SIGINT, как правило , связаны с Ctrl+C) quit
(SIGQUIT, обычно связанный с Ctrl+\) и susp
(SIGSUSP, как правило , связаны с Ctrl+Z) соответствуют фактическим сигналам UNIX. (например, kill,
не отправляет SIGKILL, но удаляет текущий ввод.)
К сожалению, нет способа отправить один из двух сигналов, которые не могут быть отключены процессом (SIGKILL и SIGSTOP), поэтому, если все три упомянутых сигнала не имеют эффекта, вам придется использовать другой способ ( например, другая оболочка), чтобы убить процесс переднего плана.
(На самом деле, в дополнение к перехвату всех трех сигналов, процесс переднего плана может даже отключить специальные комбинации клавиш в первую очередь, установив tty в "сырой" режим. Например, SSH делает это - так он может ретранслировать локально нажатые Ctrl+C на удаленный хост.)
Да, есть что-то нецелесообразное. Вы прыгаете прямо с SIGINT
на сигнал SIGKILL
. Я предлагаю, как и другие люди, рассмотреть вопрос об отправке сигналов SIGHUP
или SIGTERM
прежде чем использовать ядерную опцию. Кроме того, нежелательно иметь это в качестве привязки клавиш, что, конечно, означает, что она будет работать только тогда, когда ZLE активен, а оболочка в интерактивном режиме запрашивает ввод данных, а не во время выполнения команд. (Для этого, вам нужно будет настроить терминал, а не оболочки, и нужно иметь терминальную линию дисциплину , которая реализует отправку SIGTERM
как расширение POSIX указанного поведения.)
На этом замечании, кажется, никто еще не заметил, что вы спрашиваете о привязках клавиш редактора командной строки, а не о терминале. Чтобы ответить на первую часть вашего вопроса, затем:
Вы настраиваете функцию оболочки для отправки сигнала "текущей" работе.
function terminate-current-job() { kill -s TERM %+ ; }
Затем вы создаете пользовательский виджет ZLE, который вызывает эту функцию оболочки.
zle -N terminate-current-job terminate-current-job
Затем, наконец, вы связываете этот виджет с ключом по вашему выбору.
bindkey "^/" terminate-current-job