Come misura preventiva per l'inconveniente di dover premere CTRL- z, potresti creare uno script wrapper per il tuo editor sul quale eseguire il tuo editor in background. In questo modo non avresti bisogno di occuparti di ricordare di avviarlo in background esplicitamente:
#!/bin/sh
EDITOR="emacs" # or whatever
if [ -z "${DISPLAY}" ]; then
${EDITOR} "$@"
else
${EDITOR} "$@" &
fi
Sopra proviamo prima a determinare se hai X server disponibile e solo allora esegui l'editor in background (in caso contrario, molti editor Unix useranno invece il tuo terminale e in questo caso non vuoi eseguire l'editor come processo in background) . Passerà tutti gli argomenti al tuo editor di scelta verbatim ( "$@"
) proprio come hai fornito per lo script wrapper.
Per quanto riguarda il comando che ti manca ... Secondo la mia sperimentazione di base, per i programmi della GUI che non coinvolgono il terminale, potrebbe essere semplice come prima l'invio SIGSTOP
e poi SIGCONT
al processo in primo piano (usando il kill
comando se usi lo script della shell per implementarlo) . Ovviamente dovresti eseguirlo in un'altra finestra / scheda del terminale e la difficoltà sarebbe quella di trovare in modo generico e generico il PID a cui desideri inviare il segnale. Per impostazione predefinita, è possibile inviare i due segnali a tutti i processi del nome specificato (impostazione predefinita per l'editor preferito e consentire l'utilizzo di PID anche come argomenti):
#!/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
Questo metodo mi ha dato correttamente le mie schede dei terminali dopo aver eseguito (diversi) emacs
comandi in background. Ma il processo emacs in esecuzione nel terminale non è stato ripristinato correttamente a causa del controllo del lavoro della shell o della confusione delle impostazioni del terminale. Quindi questo metodo trarrebbe beneficio da alcune sofistificazioni.
Il SIGSTOP
è esattamente ciò che è inviare al processo in primo piano quando si preme (per default comuni) CTRL- z. Fare riferimento stty -a
all'output
$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]
(uscita abbreviata) e stty
pagina del manuale:
susp CHAR
CHAR will send a terminal stop signal
I processi arrestati utilizzando il SIGSTOP
segnale possono essere riavviati inviando SIGCONT
. Normalmente è la logica di controllo del lavoro della shell che invierà SIGCONT
e prenderà cura di altre manipolazioni necessarie coinvolte fg
e bg
comandi che ignoriamo.
tmux
offre le stesse funzionalità desiderate nella tua domanda.