Я дотримуюся цієї схеми призупинення завдання, а потім дозволяю занадто часто продовжувати Ctrl-Z bgпослідовність.
Мені було цікаво, чи є такий спосіб стиснути це одним натисканням клавіші?
Моя оболонка є zsh
Я дотримуюся цієї схеми призупинення завдання, а потім дозволяю занадто часто продовжувати Ctrl-Z bgпослідовність.
Мені було цікаво, чи є такий спосіб стиснути це одним натисканням клавіші?
Моя оболонка є zsh
Відповіді:
Послідовність 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
^ z ^ z, як zsh вище, можливо в bash, хоча це трохи невдало, і я давно не виконую це:
"\C-z": "bg\n"
Так ^ z для призупинення включається, коли виконується команда, потім вимикається для рядка bash.
Тож знайшлося рішення, не саме те, що я хочу, але закриваюсь звідси /superuser//a/161922/35223
У порожньому командному рядку працює bg (так що Ctrl + Z Ctrl + Z призупиняє програму та негайно поновлює її у фоновому режимі).
Ctrl+Z
телефонувати bg
, я не впевнений у виявленні не порожнього рядка введення).
Це команди, які ви хотіли запустити на передньому плані, а потім перейти на другий план? Я не знаю, чи є простіший спосіб зробити це. Але якщо ви хочете запустити команди, які будуть у фоновому режимі для початку, ви можете просто додати амперсанд до кінця рядка. наприклад, ping google.com &
почне пінг у фоновому режимі; ви не зможете взаємодіяти з ним, якщо не введете текст fg
.