В якості запобіжного заходу для незручності натискання CTRL- zви можете створити сценарій обгортки для свого редактора, який би запускав редактора у фоновому режимі. Таким чином, вам не потрібно буде піклуватися про запам'ятовування, щоб запустити його у фоновому режимі явно:
#!/bin/sh
EDITOR="emacs" # or whatever
if [ -z "${DISPLAY}" ]; then
${EDITOR} "$@"
else
${EDITOR} "$@" &
fi
Вище ми спершу намагаємося визначити, чи є у вас сервер X, а потім запустити редактор у фоновому режимі (якщо ні, то багато редакторів Unix замість цього використовуватимуть ваш термінал, і ви не хочете запускати редактор як фоновий процес у цьому випадку) . Він передасть усі аргументи вашому редактору вибору дословно ( "$@"
) так само, як ви вказали для сценарію обгортки.
Щодо команди, якої вам не вистачає ... Згідно з моїм базовим експериментом, для програм GUI, які не включають термінал, це може бути таким же простим, як спочатку надсилання SIGSTOP
та потім SIGCONT
процес переднього плану (використовуючи kill
команду, якщо ви використовуєте скрипт оболонки для реалізації цього) . Звичайно, потрібно запустити його в іншому вікні / вкладці терміналу, і складність полягатиме в тому, щоб зручно і загально знайти ПІД, на який ви хочете відправити свій сигнал. Ви можете за замовчуванням надіслати два сигнали всім процесам даного імені (за замовчуванням у своєму улюбленому редактору і дозволити також використовувати PIDs як аргументи):
#!/bin/sh
EDITOR=emacs # whatever
stop_cont_prog()
{
case "$1" in
# begin with number is considered PID - this is not good
# enough to be taken seriously...
[1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
*) killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
esac
}
if [ -n "$1" ]; then
for prog in "$@"; do stop_cont_prog "$1"; done
else
stop_cont_prog "${EDITOR}"
fi
Цей метод правильно передав мені свої вкладки терміналів після виконання (декількох) emacs
команд у фоновому режимі. Але процес emacs, що працює в терміналі, не був належним чином відновлений через контроль роботи оболонки або плутанину налаштування терміналу. Тож цей метод виграє від певної витонченості.
Це SIGSTOP
саме те, що надсилається до процесу переднього плану, коли ви натискаєте (за звичайними типовими значеннями) CTRL- z. Зверніться до stty -a
виводу
$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]
(вихід скорочений) та stty
сторінка керівництва:
susp CHAR
CHAR will send a terminal stop signal
Процеси, зупинені з використанням SIGSTOP
сигналу, можна перезапустити шляхом надсилання SIGCONT
. Зазвичай це керуюча логіка оболонки роботи , яка буде відправити SIGCONT
і піклуватися про інших необхідних маніпуляціях , пов'язаних з fg
і bg
командами , які ми ігноруємо.
tmux
надає таку ж функціональність, як бажано у вашому питанні.