24

Я следую этой схеме приостановки задачи и затем позволяю ей продолжаться слишком часто с последовательностью Ctrl-Z bg .

Мне было интересно, есть ли способ сжать это до одного нажатия клавиши?

Моя оболочка это zsh

4 ответа4

23

Последовательность Ctrl+Z обрабатывается терминалом, а не оболочкой. (Полезный фон: какова точная разница между терминалом, оболочкой, tty и консолью?)

Только небольшой нерасширяемый набор функций может быть связан с ключом в терминале. Вы можете настроить ключи, привязанные к этим функциям, но не добавлять другую функцию. Эти функции делятся на три категории:

  • Редакция командной строки в программах, которые не предоставляют свои собственные (канонический режим, также называемый режимом приготовления (в отличие от режима raw), который вы редко будете использовать на практике): конец файла (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
1

Так что нашел решение, не совсем то, что я хочу, но чертовски близко отсюда https://superuser.com/a/161922/35223

В пустой командной строке запускается bg (так что Ctrl+Z Ctrl+Z приостанавливает работу программы и немедленно возобновляет ее в фоновом режиме).

1

^ z ^ z, как zsh выше, возможно в bash, хотя это немного глупо, и я долго не запускал это:

  • В ваш .inputrc включите отображение "\C-z": "bg\n"
  • В переменную bash PS0 входит `$(stty susp ^ z)'
  • В переменную bash PROMPT_COMMAND входит 'stty susp ^ @'

поэтому ^ z для приостановки включается при запуске команды, а затем отключается для приглашения bash.

0

Являются ли эти команды, которые вы хотели запустить на переднем плане, а затем переключиться на фон? Я не знаю, есть ли более простой способ сделать это. Но если вы хотите запустить команды, которые будут в фоновом режиме, вы можете просто добавить амперсанд в конец строки. например, ping google.com & начнет пинговать в фоновом режиме; вы не сможете взаимодействовать с ним, пока не fg .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .