È possibile utilizzare .exec ./your-script
Un emulatore di terminale come GNOME Terminal si chiude quando termina il processo iniziale in esecuzione al suo interno, che di solito è una shell.
Se sei già in un terminale e l'unica cosa che vuoi fare prima di uscire da quel terminale è eseguire un particolare script (o programma), allora questo significa che non hai più davvero bisogno della shell che è in esecuzione in esso. Quindi puoi usare il exec
builtin della shell per fare in modo che la shell si sostituisca con il processo creato dal tuo comando.
- Nel caso del tuo script, questo è un altro processo di shell, proprio come viene creato un secondo processo di shell quando esegui uno script senza
exec
.
La sintassi è , ad esempio, .exec command
exec ./your-script
exec
: un esempio
Ad esempio, supponiamo di avere uno script di shell chiamato count
, contrassegnato come eseguibile e situato nella directory corrente. Contiene:
#!/usr/bin/env bash
for i in {5..1}; do echo $i; sleep 1; done
E, in un terminale, corro:
exec ./count
Questo stampa il numeri 5
, 4
, 3
, 2
, e 1
, una al secondo, e poi si chiude finestra di terminale.
Se lo esegui da qualcosa di diverso dal primo processo eseguito nel tuo terminale - ad esempio, se hai eseguito per bash
primo l'avvio di un'altra istanza della shell - questo ti riporta alla shell che ha creato quel processo, piuttosto che uscire dal terminale. (Questo avvertimento si applica ugualmente ai exit
metodi basati.)
È possibile utilizzare ../your-script; exit
Se non vuoi dire alla tua shell di sostituirsi con il nuovo processo (via exec
), puoi dire che si attacca ma si chiude immediatamente al termine del nuovo processo.
Per fare ciò, esegui il tuo comando e il exit
comando, separati da in ;
modo che possano essere dati su una riga.
La sintassi è command; exit
, ad esempio, ../your-script; exit
command; exit
vs. command && exit
Potresti notare che sembra simile al metodo suggerito nelle risposte di kos e di heemayl . La differenza è che:./your-script && exit
&&
esegue il secondo comando solo se il primo comando ha riferito che è riuscito restituendo un codice di uscita pari a zero.
;
esegue il secondo comando a prescindere dal fatto che il primo comando abbia riscontrato o meno successo.
Quale vuoi dipende dalla situazione specifica. Se il comando fallisce, vuoi che la shell chiamante (e il terminale di hosting) rimanga attivo? In tal caso, utilizzare &&
; in caso contrario, utilizzare ;
.
C'è anche command || exit
, che chiude la shell chiamante solo se command
segnalato un errore .