Як я можу зробити 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.