Como medida preventiva para a inconveniência de ter que pressionar CTRL- z, você pode criar um script de wrapper para o seu editor, para o qual executaria seu editor em segundo plano. Dessa forma, você não precisaria se lembrar de iniciá-lo em segundo plano explicitamente:
#!/bin/sh
EDITOR="emacs" # or whatever
if [ -z "${DISPLAY}" ]; then
${EDITOR} "$@"
else
${EDITOR} "$@" &
fi
Acima, primeiro tentamos determinar se você possui um servidor X disponível e, em seguida, apenas executa o editor em segundo plano (caso contrário, muitos editores do Unix usarão seu terminal e, nesse caso, você não deseja executar o editor como um processo em segundo plano) . Ele passará todos os argumentos para o editor de sua escolha verbatim ( "$@"
), exatamente como você forneceu para o script do wrapper.
Quanto ao comando que está faltando ... De acordo com minha experiência básica, para programas GUI que não envolvem terminal, pode ser tão simples quanto o primeiro envio SIGSTOP
e depois SIGCONT
para o processo em primeiro plano (usando o kill
comando se você usar o shell script para implementar isso) . É claro que você precisaria executá-lo em outra janela / guia do terminal, e a dificuldade seria encontrar de forma conveniente e genérica o PID para o qual você deseja enviar o sinal. Por padrão, você pode enviar os dois sinais para todos os processos do nome fornecido (por padrão, para o seu editor favorito e permitindo o uso de PIDs como argumentos):
#!/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
Esse método me deu corretamente minhas guias de terminal depois de executar (vários) emacs
comandos em segundo plano. Mas o processo emacs em execução no terminal não foi restaurado adequadamente devido ao controle de tarefas do shell ou à confusão de configurações do terminal. Portanto, esse método se beneficiaria de alguma sofisticação.
O SIGSTOP
é exatamente o que enviar para o processo em primeiro plano quando você pressiona (por padrões comuns) CTRL- z. Consulte a stty -a
saída
$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]
(saída abreviada) e stty
página de manual:
susp CHAR
CHAR will send a terminal stop signal
Os processos interrompidos usando o SIGSTOP
sinal podem ser reiniciados enviando SIGCONT
. Normalmente, é a lógica de controle de tarefas do shell que envia SIGCONT
e cuida de outras manipulações necessárias envolvidas fg
e bg
comandos que ignoramos.
tmux
ofereça a mesma funcionalidade desejada na sua pergunta.