Riavvia bash dal terminale senza riavviare l'applicazione terminale (mac)?


46

Mi sono guardato intorno e ho cercato una risposta a questa domanda ma non mi sembra di trovarla (il che è strano).

La mia domanda è: esiste un modo semplice per riavviare la sessione bash dal terminale su Mac. Voglio solo lo stesso comportamento di se avessi chiuso l'applicazione terminale e l'avessi riavviata (tutte le variabili ripristinate, .bash_profile di provenienza ecc.).

So come sorgente .bash_profile, ma non è quello che voglio. Uno dei motivi per cui voglio fare questo è perché un plug-in per il mio prompt di bash ha un codice che impedisce il caricamento dei colori più volte. Pertanto, il sourcing .bash_profile non ricarica le variabili di colore e devo riavviare l'applicazione del terminale per rendere effettive le modifiche.

Risposte:


65

exec bash dovrebbe sostituire l'attuale processo di shell con (una nuova istanza di) bash.


2
Bash nell'applicazione terminale è una shell interattiva e quindi exec bashriavvia solo quella shell interattiva? Inoltre, puoi spiegare esattamente cosa fa il comando exec e quali sono le opzioni? Grazie!
Mattias,

exec sostituisce il processo corrente con uno nuovo. Bash ha una manpage molto ben scritta ma purtroppo difficile da cercare; digitare man bash, trovare l'ultima istanza della stringa SHELL BUILTIN COMMANDS e quindi scorrere verso il basso per exec. In breve, passare il -cflag lo eseguirà senza alcuna variabile di ambiente (che potrebbe essere richiesta per i tuoi scopi, non lo so), e gli altri argomenti -l e -a probabilmente non sono cose che vuoi (sembrano essere storiche / caratteristiche oscure e specifiche). Puoi anche usare exec per aprire nuovi descrittori di file nella shell corrente, se lasci il comando.
Muzer,

Puoi mostrare un esempio di come usare exec per aprire nuovi descrittori di file nella shell corrente? E la mia domanda sulla shell interattiva / login. La shell eseguita nel terminale è una shell interattiva ed è toccata da tutto il comando exec. Infine, la risposta approvata di questa domanda raccomanda il comando exec con il flag -l, ma non capisco cosa faccia. Scusami per aver chiesto così tanto, voglio solo capire i comandi che uso.
Mattias,

1
Scusa si Non sono sicuro dei Mac, ma nel mondo Linux almeno le shell eseguite da un terminale grafico non sono (di solito) shell di accesso e stai solo riavviando la shell interattiva e non il terminale stesso o la shell di accesso. -lecco un argomento per bash e lo fa comportare come una shell di login. L'apertura dei descrittori di file nella shell corrente non ha nulla a che fare con la domanda, ma è possibile utilizzare exec 4<>test.txtad esempio per fare in modo che il descrittore di file 4 punti a test.txt. Quindi nel resto della shell è possibile eseguire echo test>&4l'output su test.txt.
Muzer,

1
@Muzer per motivi che non posso dire di essere completamente d'accordo, OSX ha deciso che gli emulatori di terminali GUI eseguiranno shell di login .
terdon

1

La risposta accettata è ottima per una shell che utilizza bash, che è anche ciò che l'OP ha chiesto, tuttavia sto usando Terminal su macOS con una shell non predefinita (zsh) e exec bashovviamente l'esecuzione del comando non ha l'effetto desiderato : avvia bash invece della mia shell predefinita.

Quindi sarebbe il comando ambiente-agnostico exec $SHELLche utilizza la variabile d'ambiente $SHELLche memorizza la shell predefinita per l'utente.

Inoltre, tieni presente che Apple sostituirà bash con zsh in macOS Catalina in modo da avere l'effetto che l'OP sta cercando in esecuzione exec zsho exec $SHELLsarà la strada da percorrere dopo l'aggiornamento a macOS 10.15.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.