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 SIGSTOPy luego SIGCONTal proceso de primer plano (usando el killcomando 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) emacscomandos 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 SIGSTOPes exactamente lo que se envía al proceso de primer plano cuando presiona (por defecto común) CTRL- z. Consulte la stty -asalida
$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]
(salida abreviada) y sttypágina del manual:
susp CHAR
CHAR will send a terminal stop signal
Los procesos detenidos mediante la SIGSTOPseñal se pueden reiniciar enviando SIGCONT. Normalmente, es la lógica de control de trabajo de shell la que enviará SIGCONTy se encargará de otras manipulaciones necesarias involucradas fgy bgcomandos que ignoramos.
tmuxofrece la misma funcionalidad deseada en su pregunta.