Como medida preventiva por la inconveniencia de tener que pulse CTRL- z, usted podría hacer un script de envoltorio para su editor para que ejecute su editor en el fondo. De esta manera, no necesitaría tener cuidado de recordar iniciarlo en segundo plano explícitamente:
#!/bin/sh
EDITOR="emacs" # or whatever
if [ -z "${DISPLAY}" ]; then
${EDITOR} "$@"
else
${EDITOR} "$@" &
fi
Arriba, primero tratamos de determinar si tiene un servidor X disponible y solo luego ejecuta el editor en segundo plano (si no, muchos editores de Unix usarán su terminal y no desea ejecutar el editor como un proceso en segundo plano en este caso) . Pasará todos los argumentos a su editor de elección literal ( "$@"
) tal como lo proporcionó para el script de envoltura.
En cuanto al comando que se está perdiendo ... Según mi experimentación básica, para los programas GUI que no involucran terminal, podría ser tan simple como enviar primero SIGSTOP
y luego SIGCONT
al proceso de primer plano (usando el kill
comando si usa un script de shell para implementar esto) . Por supuesto, necesitaría ejecutarlo en otra ventana / pestaña de terminal, y la dificultad sería encontrar de manera conveniente y genérica el PID al que desea enviar su señal. Por defecto, puede enviar las dos señales a todos los procesos del nombre dado (por defecto a su editor favorito y permitiendo también usar PID 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
Este método me dio correctamente mis pestañas de terminal después de ejecutar (varios) emacs
comandos en segundo plano. Pero el proceso de emacs que se ejecuta en el terminal no se restauró correctamente debido al control del trabajo de shell o la confusión de la configuración del terminal. Entonces, este método se beneficiaría de cierta sofisticación.
Esto SIGSTOP
es exactamente lo que se envía al proceso de primer plano cuando presiona (por defecto común) CTRL- z. Consulte la stty -a
salida
$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]
(salida abreviada) y stty
página del manual:
susp CHAR
CHAR will send a terminal stop signal
Los procesos detenidos mediante la SIGSTOP
señal se pueden reiniciar enviando SIGCONT
. Normalmente, es la lógica de control de trabajo de shell la que enviará SIGCONT
y se encargará de otras manipulaciones necesarias involucradas fg
y bg
comandos que ignoramos.
tmux
ofrece la misma funcionalidad deseada en su pregunta.