Як я можу зробити Ctrl-Z і bg одним натисканням клавіш, щоб процес продовжувався у фоновому режимі?


25

Я дотримуюся цієї схеми призупинення завдання, а потім дозволяю занадто часто продовжувати Ctrl-Z bgпослідовність.

Мені було цікаво, чи є такий спосіб стиснути це одним натисканням клавіші?

Моя оболонка є zsh


Хочу сказати, що це, мабуть, важко закодовано. Але я не на 100%
Чад Гаррісон

Звичайно, але я знайшов елегантне рішення, дякую superuser.com/a/161922/35223
Євген Долженко

Відповіді:


24

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

Лише невеликий нерозширюваний набір функцій може бути прив'язаний до ключа в терміналі . Ви можете налаштувати ключі, пов'язані з цими функціями, але не додавати іншу функцію. Ці функції поділяються на три категорії:

  • Видання командного рядка в програмах, які не надають свого власного (канонічний режим, який також називають приготовленим режимом (протиставленням сирому режиму), який ви рідко використовуєте на практиці): кінець файлу ( 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, розширюють цей список, але я ніколи не бачив жодної, яка б включала фонове зображення. Зауважте, що вона потребує підтримки як у драйвері термінала в ядрі, так і в емуляторі терміналу. Тож вам доведеться зробити призупинення, яке надсилає завдання переднього плану сигнал 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

Жиль, це неймовірно повна, освітянська та продумана відповідь, яку я не міг очікувати! Дуже дякую!
Євгеній Долженко

2

^ z ^ z, як zsh вище, можливо в bash, хоча це трохи невдало, і я давно не виконую це:

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

Так ^ z для призупинення включається, коли виконується команда, потім вимикається для рядка bash.


1

Тож знайшлося рішення, не саме те, що я хочу, але закриваюсь звідси /superuser//a/161922/35223

У порожньому командному рядку працює bg (так що Ctrl + Z Ctrl + Z призупиняє програму та негайно поновлює її у фоновому режимі).


Зауважу, що для цього потрібна zsh; він не підтримується в bash. (поза межами коробки, все одно)
Кевін М

@KevinM Ви можете написати аналогічну функцію в bash (принаймні базову версію Ctrl+Zтелефонувати bg, я не впевнений у виявленні не порожнього рядка введення).
Жил "ТАК - перестань бути злим"

0

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


1
Дякую, проблема полягає в тому, що іноді ти не маєш уявлення про те, скільки часу запускає команда, тому ти запускаєш інтерактивно і потім усвідомлюєш, що краще нехай це продовжується на тлі. Прийнята відповідь творить чудеса для мене, використовуючи її щодня!
Євгеній Долженко

Дякуємо за відповідь. Прийнята відповідь досить акуратна!
октерн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.