Prima di tutto, una volta avviato un processo, si può fare uno sfondo fermandolo prima (premere Ctrl-Z) e poi digitando bg
per farlo riprendere in background. Ora è un “lavoro”, e i suoi stdout
/stderr
/stdin
sono ancora collegati al vostro terminale.
Potete iniziare un processo come sfondo immediatamente aggiungendo un “&” alla fine di esso:
firefox &
Per eseguirlo in background silenziato, usate questo:
firefox </dev/null &>/dev/null &
Alcune informazioni aggiuntive:
nohup
è un programma che potete usare per eseguire la vostra applicazione con in modo che il suo stdout/stderr possa invece essere inviato ad un file e in modo tale che la chiusura dello script padre non SIGHUP il figlio. Tuttavia, è necessario aver avuto la lungimiranza di usarlo prima di avviare l'applicazione. A causa del modo in cui funziona nohup
, non è possibile applicarlo a un processo in esecuzione.
disown
è un bash builtin che rimuove un lavoro shell dalla lista dei lavori shell. Ciò significa fondamentalmente che non si può più usare fg
, bg
su di esso, ma, cosa più importante, quando si chiude il guscio non si appende o non si invia più un SIGHUP
a quel bambino. A differenza di nohup
, disown
viene usato **dopo che il processo è stato lanciato e messo in background.
Quello che non potete_ fare, è cambiare lo stdout/stderr/stdin di un processo dopo averlo lanciato. Almeno non dal guscio. Se lanciate il vostro processo e gli dite che il suo stdout è il vostro terminale (che è quello che fate di default), allora quel processo è configurato per l'output sul vostro terminale. La vostra shell non ha nulla a che fare con l'impostazione del FD dei processi, che è puramente qualcosa che il processo stesso gestisce. Il processo stesso può decidere se chiudere o meno il suo stdout/stderr/stdin, ma non potete usare la vostra shell per forzarlo a farlo.
Per gestire l'output di un processo in background, avete un sacco di opzioni da script, “nohup” è probabilmente il primo che vi viene in mente. Ma per i processi interattivi si inizia ma si dimentica di mettere a tacere (firefox < /dev/null &>/dev/null &
) non si può fare molto, davvero.
Vi consiglio di prendere GNU screen
. Con lo schermo potete semplicemente chiudere il vostro guscio in esecuzione quando l'uscita del processo diventa un fastidio e aprirne uno nuovo (^Ac
).
Oh, e a proposito, non usate “$@
” dove lo state usando.
$@
significa, $1
, $2
, $3
, $1
…, che trasformerebbe il vostro comando in:
gnome-terminal -e "vim $1" "$2" "$3" ...
Probabilmente non è quello che volete perché -e prende solo un solo argomento. Usate gnome-terminal -e
per mostrare che il vostro script può gestire un solo argomento.
È davvero difficile far funzionare correttamente più argomenti nello scenario che avete dato (con l’-e
) perché &007 prende solo un argomento, che è una stringa di comando di shell. Dovreste codificare i vostri argomenti in uno solo. Il modo migliore e più robusto, ma piuttosto cludgy, è così:
gnome-terminal -e "vim $(printf "%q " "$@")"