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 " "$@")"