Я следую этой схеме приостановки задачи и затем позволяю ей продолжаться слишком часто с последовательностью Ctrl-Z bg .
Мне было интересно, есть ли способ сжать это до одного нажатия клавиши?
Моя оболочка это zsh
Я следую этой схеме приостановки задачи и затем позволяю ей продолжаться слишком часто с последовательностью Ctrl-Z bg .
Мне было интересно, есть ли способ сжать это до одного нажатия клавиши?
Моя оболочка это zsh
Последовательность Ctrl+Z обрабатывается терминалом, а не оболочкой. (Полезный фон: какова точная разница между терминалом, оболочкой, tty и консолью?)
Только небольшой нерасширяемый набор функций может быть связан с ключом в терминале. Вы можете настроить ключи, привязанные к этим функциям, но не добавлять другую функцию. Эти функции делятся на три категории:
eof
, Ctrl+D), конец строки (eol
, Ctrl+M), стереть символ влево (erase
, Ctrl+H), стереть слово влево (werase
, Ctrl+W), стереть строку (kill
, Ctrl+U).stop
(Ctrl+S), start
(Ctrl+Q). Полезно только на старых последовательных терминалах, которые пропускали символы, когда терминал не мог угнаться за компьютером или наоборот.intr
, Ctrl+C), принудительное завершение (quit
, Ctrl+\), приостановка (Ctrl+Z).Некоторые системы, в том числе Linux, расширяют этот список, но я никогда не видел ни одной, включающей фоновую обработку. Обратите внимание, что он будет поддерживаться как в драйвере терминала в ядре, так и в эмуляторе терминала. Таким образом, вы должны обойтись с suspend, который отправляет переднему плану сигнал SIGTSTP . Это запускает SIGCHLD в родительском процессе лидера приоритетного задания, которым обычно является оболочка. Когда оболочка получает SIGCHLD, она вызывает waitpid
чтобы выяснить, почему она была уведомлена, и, обнаружив, что фоновое задание было приостановлено, отображает уведомление (например, [1] + 12345 suspended mycommand
) и новое приглашение.
Вы можете запрограммировать оболочку для отправки сигнала SIGCONT
на задание переднего плана. Я не думаю, что у zsh есть ловушка для этого, вам нужно будет исправить исходный код. И у zsh нет возможности узнать, действительно ли вы намеревались прервать программу (упс, эта программа может делать что-то не так, позвольте мне приостановить ее, пока я разберусь) или справиться с ней.
Что я делаю, так это задаю последовательность клавиш Ctrl+Z в zsh для фонового отображения текущего задания (%%
). Таким образом, я могу отправить задний план на задний план, нажав Ctrl+Z Ctrl+Z. Пока я в этом, я заставляю Ctrl+Z делать что-то еще полезное, когда текущая строка ввода не пуста (поэтому я не просто вернулся из подпроцесса): «приостановить» текущую строку ввода, позволяя мне набрать другая команда, после которой прерванная строка помещается обратно во входной буфер.
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
bg
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
Так что нашел решение, не совсем то, что я хочу, но чертовски близко отсюда https://superuser.com/a/161922/35223
В пустой командной строке запускается bg (так что Ctrl+Z Ctrl+Z приостанавливает работу программы и немедленно возобновляет ее в фоновом режиме).
^ z ^ z, как zsh выше, возможно в bash, хотя это немного глупо, и я долго не запускал это:
"\C-z": "bg\n"
поэтому ^ z для приостановки включается при запуске команды, а затем отключается для приглашения bash.
Являются ли эти команды, которые вы хотели запустить на переднем плане, а затем переключиться на фон? Я не знаю, есть ли более простой способ сделать это. Но если вы хотите запустить команды, которые будут в фоновом режиме, вы можете просто добавить амперсанд в конец строки. например, ping google.com &
начнет пинговать в фоновом режиме; вы не сможете взаимодействовать с ним, пока не fg
.