OSX - Come chiudere automaticamente la finestra del terminale dopo aver eseguito il comando "exit".


104

Quando ho finito con Terminal, voglio uscirlo. In questo momento, ho tre opzioni:

  1. killall Terminal. Terminerà il processo, ma piuttosto bruscamente. Non credo che questa sia l'idea migliore.

  2. Uscita dalla chiamata. Ho modificato le impostazioni, quindi esci chiude il Terminale. L'app appare ancora aperta nel Dock e non fa ciò che voglio che faccia.

  3. Fare clic con il tasto destro> Esci. Tuttavia, questo non è un comando di Terminale per uscirlo.

Allora, qual è il modo in cui dovrei uscire e chiudere il Terminal? Ho sentito qualcosa su osascript ma non ne sono troppo sicuro. Voglio uscire e chiudere, in modo che Terminal non sia più aperto, sia come finestra che come processo.


Ad esempio kill, l' killallimpostazione predefinita è l'invio SIGTERM, che può essere intercettato. Alcuni programmi lo rilevano, si puliscono dopo se stessi e si chiudono con grazia. Non ho idea se Terminal.appsia tra loro. Tuttavia, sospetto che questo sarebbe meglio su Ask Different o Super User in un pizzico in quanto non sembra avere alcun contenuto di programmazione.
dmckee --- gattino ex moderatore

1
Penso che la domanda sarebbe meglio formulata "Come uscire dal terminale dopo l'uscita dell'ultima shell?".
Chris Page

Possibile duplicato della finestra
bob

Risposte:


194

in Terminal.app

Preferenze> Profili> (Seleziona un profilo)> Shell.

su 'Quando la shell esce' scelto 'Chiudi la finestra'


@PrabhuKonchada non sarebbe troppo terribile se volessi usare quello spazio per alimentare l'output dell'utente, ma altrimenti la risposta di insanikov avrebbe funzionato bene per me
Frankenmint

Ovvio e pulito, perfetto.
aydinugur

12
Nelle versioni più recenti di OS X, questa opzione si trova in "Preferenze> Profili> (Seleziona un profilo)> Shell.
XtraSimplicity

Puoi utilizzare il link per ulteriori informazioni sui passaggi cnet.com/news/terminal-tip-close-windows-after-clean-exit
Krishan Kumar Mourya

1
Puoi anche selezionare tutti i profili e apportare la modifica a tutti in una volta.

31

Che ne dici del buon vecchio Command-Q?


Significa comando Q. È un buon metodo però? A me non sembra diverso da killall.
Darksteel

@darksteel: Command-Q è il modo corretto per chiudere un'app sul Mac. Anche fare un killall è probabilmente OK poiché l'app viene detto di terminare in modo pulito.
tomlogic

2
Sì, volevo digitare "Command" ma è uscito come Ctrl. Direi che è un caso di PEBBAF (esiste un problema tra il cervello e la punta delle dita).
Holygeek

kill / killall non è un buon modo per terminare un'applicazione, generalmente. Ciò potrebbe eliminare lo stato non salvato o salvare lo stato che non riflette correttamente l'aspetto dell'applicazione se l'avessi chiuso. Mac OS X ha una funzione "Terminazione improvvisa" in cui i programmi possono indicare quando si trovano in uno stato in cui è sicuro ucciderli (con SIGKILL, appunto) e se hai controllato lo stato del Terminale con Activity Monitor per verificarlo è sicuro interromperlo prima (mostra la colonna "Terminazione improvvisa" e cerca "Sì"), puoi farlo, ma non puoi automatizzare facilmente quel flusso di lavoro.
Chris Page

Possiamo sempre usare il comando-Q dopo l'uscita, che chiude tutto il processo e quindi chiude il terminale.
Optimus Prime

29

Nell'app Terminale, scheda Preferenze >> Profili .

Seleziona la scheda Shell a destra. inserisci qui la descrizione dell'immagine

Puoi scegliere Non chiedere mai prima di chiudere per sopprimere l'avviso.


5
Ho ottenuto questo risultato con When shell exits:"chiudi la finestra"
Anup

1
Questa risposta non ha funzionato per me scegliendo "Mai". Tuttavia il commento di @ Anup su "Chiudi la finestra" ha funzionato per me.
Ultimater

12

In realtà, dovresti impostare una configurazione sul tuo terminale, quando il tuo terminale è attivo premi + ,quindi vedrai la schermata seguente:

inserisci qui la descrizione dell'immagine

Quindi premi la scheda della shell e vedrai la schermata seguente:

inserisci qui la descrizione dell'immagine

Ora seleziona Close if the shell exited cleanlyper Quando la shell esce .

Con la configurazione di cui sopra ogni volta con il exitcomando il Terminale si chiuderà ma non si chiuderà.


10

Puoi usare AppleScript tramite il osascriptcomando:

osascript -e 'tell application "Terminal" to quit'

Non avevo provato il comando osascript, ma ci sono due problemi che ho con questo: 1. È piuttosto lungo per chiudere un comando. Non dovrebbe essere più semplice? Mi piace in Windows come l'uscita termina il prompt dei comandi. 2. Mi viene comunque chiesto di uscire da Terminal. Voglio che passi solo attraverso i movimenti. Si è aperta una finestra che mi ha chiesto se volevo davvero smettere.
Darksteel

1
@darksteel: 1. Aggiungi un alias nel tuo .bashrc(o equivalente se usi una shell diversa). Sto ancora pensando a una risposta a 2.
icktoofay

Penso che il comando Q funzioni meglio. Ma sono curioso di sapere come impostare correttamente un alias. Ci sono alcuni comandi come "ping google.com" che eseguo abbastanza spesso da poter preferire un alias.
Darksteel

@darksteel: Questo è un modo per pensarci troppo, ma per evitare 2, potresti avviare un processo daemonizzato che dorme circa un secondo, e poi exitdopo aver avviato il processo daemonizzato. Dopo che il processo daemonizzato ha atteso un secondo, potrebbe chiamare osascriptcome descritto.
icktoofay

@darksteel: Si può anche innescare pressione di un tasto attraverso osascript: tell application "System Events" to keystroke "a" using command down. Probabilmente anche questo avrà il problema.
icktoofay

9

In una finestra di terminale, puoi digitare:

kill -9 $(ps -p $PPID -o ppid=)

Questo terminerà il processo dell'applicazione Terminale, che è il genitore del genitore del processo corrente, come si vede dal comando kill.

Per chiudere una finestra di Terminale dall'interno di uno script in esecuzione, è necessario salire di un altro livello nella gerarchia del processo in questo modo:

kill -9 $(ps -p $(ps -p $PPID -o ppid=) -o ppid=) 

7
Cordiali saluti, questa soluzione uccide anche altre finestre di terminale.
tresf

E non usare a kill -9meno che tu non sappia che altri segnali non funzioneranno.
tripleee

9

Sto usando ctrl + d. Ti getta nella destinazione in cui hai avviato il comando sqlite3 in primo luogo.


5

osascript -e "tell application \"System Events\" to keystroke \"w\" using command down"

Questo simula la pressione di un tasto CMD+ w.

Se vuoi che Terminal si chiuda completamente puoi usare: osascript -e "tell application \"System Events\" to keystroke \"q\" using command down"

Questo non dà errori e fa fermare il terminale in modo pulito.


4

Puoi anche utilizzare questo comando contorto, che non attiva un avviso sulla terminazione del proprio processo:
osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit

Questo comando è piuttosto lungo, quindi puoi definire un alias (come quit) nel tuo profilo bash:
alias quit='osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit'

Ciò ti consentirebbe di digitare semplicemente quitnel terminale senza dover armeggiare con altre impostazioni.


2

Usa il osascriptcomando nel tuo codice come menzionato da icktoofay:osascript -e 'tell application "Terminal" to quit'

Quindi, apri le preferenze del terminale, vai su Impostazioni> Shell e imposta "Chiedi conferma prima di chiudere:" su "Mai". Il terminale dovrebbe ora chiudersi completamente (non rimanere aperto nel dock) e ignorare il prompt prima di uscire. Se hai solo una finestra di Terminale aperta e il osascriptcomando è l'ultima riga di codice, dovrebbe attendere il completamento di qualsiasi comando che hai eseguito prima.

Questo non sarebbeideale se stai eseguendo script nella stessa finestra o altre finestre in background (ad esempio, puoi eseguire un comando in background e continuare a utilizzare la finestra corrente per altri comandi se il primo comandoè seguito da una e commerciale ); stai attento!

Se racchiudi il osascriptcodice in un file di script di shell, puoi probabilmente chiamarlo con qualsiasi nome di file conciso gli dai --- fintanto che si trova nel percorso di ricerca di Terminal (corri echo $PATHper vedere dove Terminal cerca gli script).


1

Crea uno script:

cat ~/exit.scpt

come questo:

  • Nota: se c'è solo una finestra, esci dall'applicazione, altrimenti simula command + wper chiudere la scheda)

tell application "Terminal" set WindowNum to get window count if WindowNum = 1 then quit else tell application "System Events" to keystroke "w" using command down end if end tell

Quindi aggiungi un alias nel tuo * shrc

proprio come vi ~/.bashrco zshrc(qualcos'altro?)

aggiungilo: alias exit="osascript ~/exit.scpt"

E fonte il ~ / .bashrc o riapri il tuo terminal.app


0

Ho usato

esci da -n terminale

alla fine dei miei script. Devi avere il terminale impostato per non chiedere mai nelle preferenze

Quindi Terminale> Preferenze> Impostazioni> Shell Quando la shell esce Chiudi la finestra Richiedi prima di chiudere Mai


0

Ho provato diverse varianti delle risposte qui. Indipendentemente da ciò che provo, posso sempre trovare un caso d'uso in cui all'utente viene richiesto di chiudere Terminal.

Poiché il mio script è un semplice ( drutil -drive 2 tray open- per aprire una specifica unità DVD), l'utente non ha bisogno di vedere la finestra del Terminale mentre lo script è in esecuzione.

La mia soluzione era trasformare lo script in un'app, che esegue lo script senza visualizzare una finestra di Terminale. Il vantaggio aggiuntivo è che tutte le finestre del terminale già aperte rimangono aperte e, se nessuna è aperta, il terminale non rimane residente al termine dello script. Non sembra affatto avviare Terminal per eseguire lo script bash.

Ho seguito queste istruzioni per trasformare il mio script in un'app: https://superuser.com/a/1354541/162011


-3

Se si tratta di un Mac, digita "esci" e premi Invio.

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.