В качестве меры предосторожности, связанной с неудобством необходимости нажимать 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
дает ту же функциональность, которая требуется в вашем вопросе