Prima di tutto; una volta che hai avviato un processo, puoi metterlo in background fermandolo prima (premi Ctrl- Z) e poi digitando bgper farlo riprendere in background. Ora è un "lavoro" e i suoi stdout/ stderr/ stdinsono ancora connessi al tuo terminale.
È possibile avviare immediatamente un processo come sfondo aggiungendo un "&" alla fine:
firefox &
Per eseguirlo in background messo a tacere, utilizzare questo:
firefox </dev/null &>/dev/null &
Alcune informazioni aggiuntive:
nohupè un programma che puoi usare per eseguire la tua applicazione in modo tale che il suo stdout / stderr possa essere inviato a un file e tale che la chiusura dello script genitore non SIGHUP il figlio. Tuttavia, è necessario aver avuto la lungimiranza di averlo usato prima di avviare l'applicazione. A causa del modo in cui nohupfunziona, non puoi semplicemente applicarlo a un processo in esecuzione .
disownè un built-in bash che rimuove un lavoro shell dall'elenco dei lavori della shell. Ciò che sostanzialmente significa che non puoi più usarlo fg, bgma soprattutto, quando chiudi la shell non si bloccherà o invierà più SIGHUPa quel bambino. Diversamente nohup, disownviene utilizzato dopo l'avvio e il background del processo.
Quello che non puoi fare è cambiare lo stdout / stderr / stdin di un processo dopo averlo lanciato. Almeno non dalla shell. Se avvii il tuo processo e dici che il suo stdout è il tuo terminale (che è quello che fai di default), quel processo è configurato per l'output sul tuo terminale. La tua shell non ha rapporti commerciali con la configurazione FD dei processi, che è puramente qualcosa che il processo stesso gestisce. Il processo stesso può decidere se chiudere o meno lo stdout / stderr / stdin, ma non è possibile utilizzare la shell per forzarlo.
Per gestire l'output di un processo in background, hai molte opzioni dagli script, "nohup" probabilmente è il primo a venire in mente. Ma per i processi interattivi si avvia ma si è dimenticati del silenzio ( firefox < /dev/null &>/dev/null &) non si può fare molto, davvero.
Ti consiglio di ottenere GNU screen. Con lo schermo puoi semplicemente chiudere la shell in esecuzione quando l'output del processo diventa un problema e aprirne uno nuovo ( ^Ac).
Oh, a proposito, non usare " $@" dove lo stai usando.
$@significa, $1, $2, $3..., atta a rendere il vostro comando in:
gnome-terminal -e "vim $1" "$2" "$3" ...
Probabilmente non è quello che vuoi perché prende solo un argomento. Usa $1per mostrare che il tuo script può gestire solo un argomento.
È davvero difficile far funzionare correttamente più argomenti nello scenario che hai fornito (con il gnome-terminal -e) perché -eaccetta solo un argomento, che è una stringa di comandi della shell. Dovresti codificare i tuoi argomenti in uno solo. Il modo migliore e più robusto, ma piuttosto rozzo, è così:
gnome-terminal -e "vim $(printf "%q " "$@")"