Як ви надсилаєте програми командного рядка безпосередньо на задній план?


22

Я вже знаю, що натискання ctrl+zзупиняє додаток, то я можу відправити додаток на задній план за допомогою bgкоманди, але це означає, що існує короткий період часу, коли додаток зупинено.

Як я можу надсилати додаток безпосередньо на задній план, не зупиняючи його?


Напевно, ви не можете, якщо це вже працює.
Кевін

1
Якщо ваше завдання вимагає вашого введення "перед тим, як зникнути" на задньому плані, ви можете використовувати такі інструменти, як zenity або yad (якщо вам подобається guis). Вони все ще можуть надсилати та отримувати вихід із фону. Я впевнений, що граючи з трубами та пристроями, ви також отримаєте доступ до консолі з фону, але я не знаю, як це зробити.
Джо

@Joe Це круто, але зовсім не те, що я маю на увазі. Я просто хочу надіслати додаток прямо на другий план, не призупиняючи його. тобто без натискання, ctrl+zпісля чого виконується команда bg. Чи є одна комбінація натискання клавіш, щоб надіслати додаток на задній план?
trusktr

Відповіді:


17

Надіслати програму з переднього плану на задній план вимагає співпраці як терміналу, так і оболонки. Термінал не може зробити це самостійно, оскільки оболонка повинна встановити групу процесу переднього плану. Оболонка не може зробити це самостійно, оскільки термінал повинен обробляти натискання клавіш (оболонка не на передньому плані, тому вона не може отримувати натискання клавіші).

Близьким наближенням є надсилання програми на задній план дійсно швидко. Зрештою, додаток ділиться процесорним часом з іншими, і пауза в кілька сотих секунди не має значення. (Це стосується додатків у режимі реального часу, тому переконайтеся, що запускаєте ті у фоновому режимі.) Я використовую прив'язку оболонки для Ctrl+, Zяка надсилає останнє передпланове завдання на задній план. Таким чином, натискання Ctrl+ Z Ctrl+ Zнадсилає завдання на задній план із мінімальним часом призупинення.

Ось моє zsh прив'язка, яка також "тла" напівнаписану команду, коли командний рядок не порожній .

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

Англійською мовою, для користувачів, які не користуються zsh:

  • Визначте функцію оболонки, яка виконує такі дії:

  • Прив’яжіть цю функцію до Ctrl+ Z.

Якщо ви просто хочете фонову поведінку незалежно від того, чи командний рядок порожній:

function bg_ { builtin bg "$@"; }
zle -N bg_
bindkey '^Z' bg_

Я не знаю, чи можете ви зробити так само в баш. Це повинно бути таким же простим bind -x '"\C-z": bg', за винятком того, що bash залишає символ tty stop на місці, тому він ніколи не отримує Ctrl+ Zяк вхід.


Цікаво, дозвольте мені побачити, чи можна це зробити в Bash. Якщо так, то це було б рішення. Я не знайомий із zsh. Розумієте, що робить ваш сценарій?
trusktr

@trusktr Дивіться мою редакцію.
Жил "ТАК - перестань бути злим"

Спасибі! Я збираюся перейти на zsh. Я чув про це так багато хороших речей.
trusktr

15

Ви можете створити фонову задачу, додавши &після неї.

Наприклад tail -f /var/log/messages &, негайно буде виконано фонове завдання.

Як завжди, ви можете бачити, які завдання ви створили з jobsкомандою.

Звичайно, це передбачає, що ви ще не виконали команду.


Це корисно, але я не маю на увазі. Якщо у мене додаток на передньому плані, то хочу пізніше надіслати його на фон, я можу натиснути, ctrl+zа потім виконати bgв командному рядку, щоб програма працювала у фоновому режимі. Але між натисканням ctrl+zта виконанням bgє часовий інтервал, що додаток повністю призупинено. Я цього не хочу. Як я можу негайно відправити його на задній план ?
trusktr

@trusktr, як сказав Жилл. Потрібно повідомити і оболонку, і термінал. Вибачте, я не знаю способу зробити це.
prateek61

Це не дає відповіді на запитання.
Лучано Андресс Мартіні

4

Підтвердження команди виконується додаванням в команду амперсанда.

sleep 300 &

Якщо він уже запущений, ваш єдиний варіант - зупинити його, тоді вимкніть його.


Між натисканням клавіш ctrl + z та виконанням bg існує часовий проміжок, що додаток повністю призупинено, чого я не хочу. Таким чином , немає ніякого способу , щоб відправити його у фоновий режим відразу ?
trusktr

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