Prima di tutto; una volta che hai avviato un processo, puoi metterlo in background fermandolo prima (premi Ctrl- Z) e poi digitando bg
per farlo riprendere in background. Ora è un "lavoro" e i suoi stdout
/ stderr
/ stdin
sono 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 nohup
funziona, 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
, bg
ma soprattutto, quando chiudi la shell non si bloccherà o invierà più SIGHUP
a quel bambino. Diversamente nohup
, disown
viene 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 $1
per 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é -e
accetta 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 " "$@")"