В качестве меры предосторожности, связанной с неудобством необходимости нажимать CTRL- z, вы можете сделать скрипт-редактор для вашего редактора, который будет запускать ваш редактор в фоновом режиме. Таким образом, вам не нужно заботиться о том, чтобы не забыть явно запустить его в фоновом режиме:
#!/bin/sh
EDITOR="emacs" # or whatever
if [ -z "${DISPLAY}" ]; then
${EDITOR} "$@"
else
${EDITOR} "$@" &
fi
Выше мы сначала попытаемся определить, доступен ли у вас X-сервер, и только потом запускать редактор в фоновом режиме (если нет, многие редакторы Unix вместо этого будут использовать ваш терминал, и вы не хотите запускать редактор в качестве фонового процесса в этом случае) , Он передаст все аргументы вашему редактору verbatim ( "$@") точно так же, как вы указали для сценария оболочки.
Что касается команды, которую вы пропустили ... Согласно моим основным экспериментам, для программ с графическим интерфейсом, которые не используют терминал, это может быть так же просто, как сначала отправить, SIGSTOPа затем SIGCONTв процесс переднего плана (используя killкоманду, если вы используете сценарий оболочки для реализации этого) , Вам, конечно, нужно будет запустить его в другом окне / вкладке терминала, и сложность будет заключаться в том, чтобы удобно и в общем случае найти PID, на который вы хотите отправить свой сигнал. По умолчанию вы можете отправить два сигнала всем процессам с заданным именем (по умолчанию ваш любимый редактор и разрешить использование PID в качестве аргументов):
#!/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дает ту же функциональность, которая требуется в вашем вопросе