OSX - So schließen Sie das Terminalfenster automatisch, nachdem der Befehl "exit" ausgeführt wurde.

104

Wenn ich mit dem Terminal fertig bin, möchte ich es beenden. Im Moment habe ich drei Möglichkeiten:

  1. Killall Terminal. Es wird den Prozess beenden, aber ziemlich abrupt. Ich denke nicht, dass dies die beste Idee ist.

  2. Anruf beenden. Ich habe die Einstellungen geändert, sodass Exit das Terminal schließt. Die App wird jedoch weiterhin im Dock geöffnet und macht nicht das, was ich möchte.

  3. Rechtsklick> Beenden. Dies ist jedoch kein Terminalbefehl zum Beenden.

Wie soll ich nun das Terminal verlassen und schließen? Ich habe etwas über Osascript gehört, bin mir aber nicht sicher. Ich möchte beenden und schließen, damit das Terminal nicht mehr geöffnet ist, sowohl als Fenster als auch als Prozess.

dunkler Stahl
quelle
Standardmäßig killwird killallgesendet SIGTERM, was abgefangen werden kann. Einige Programme fangen es auf, räumen nach sich selbst auf und beenden es ordnungsgemäß. Keine Ahnung, ob Terminal.appunter ihnen ist. Ich vermute jedoch, dass dies zur Not bei Ask Different oder Super User besser wäre, da es keinen Programminhalt zu haben scheint.
dmckee --- Ex-Moderator Kätzchen
1
Ich denke, die Frage wäre besser formuliert: "Wie kann ich das Terminal verlassen, nachdem die letzte Shell beendet wurde?".
Chris Page

Antworten:

194

in Terminal.app

Einstellungen> Profile> (Profil auswählen)> Shell.

on 'Wenn die Shell beendet wird' gewählt 'Fenster schließen'

Herzog
quelle
@ PrabhuKonchada wäre nicht zu schrecklich, wenn Sie diesen Raum nutzen wollten, um Benutzerausgaben zu füttern, aber sonst hätte Insanikovs Antwort für mich sehr gut getan
Frankenmint
Offensichtlich und sauber, perfekt.
Aydinugur
12
In den neueren Versionen von OS X finden Sie diese Option unter "Einstellungen> Profile> (Profil auswählen)> Shell.
XtraSimplicity
Sie können den Link für weitere und schrittweise Informationen verwenden. Cnet.com/news/terminal-tip-close-windows-after-clean-exit
Krishan Kumar Mourya
1
Sie können auch alle Profile auswählen und alle gleichzeitig ändern.
31

Wie wäre es mit dem guten alten Command-Q?

Holygeek
quelle
Er meint Befehl Q. Ist das aber eine gute Methode? Es scheint mir nicht anders als Killall.
Darksteel
@darksteel: Command-Q ist der richtige Weg, um eine App auf dem Mac zu schließen. Ein Killall zu machen ist wahrscheinlich auch in Ordnung, da die App angewiesen wird, sauber zu beenden.
Tomlogic
2
Ja, ich wollte "Command" eingeben, aber es kam als Strg heraus. Ich würde sagen, es ist ein Fall von PEBBAF (Problem besteht zwischen Gehirn und Fingerspitzen).
Holygeek
kill / killall ist im Allgemeinen kein guter Weg, um eine Anwendung zu beenden. Dies könnte den nicht gespeicherten Status verwerfen oder den Status speichern, der nicht korrekt widerspiegelt, wie die Anwendung aussehen würde, wenn Sie sie beenden würden. Mac OS X verfügt über die Funktion "Plötzliche Beendigung", mit der Programme anzeigen können, wann sie sich in einem Zustand befinden, in dem sie sicher beendet werden können (tatsächlich mit SIGKILL), und ob Sie den Status des Terminals mit Activity Monitor überprüft haben, um dies zu überprüfen Es ist sicher, es zuerst zu beenden (zeigen Sie die Spalte "Plötzliche Beendigung" und suchen Sie nach "Ja"). Sie können dies dann tun, aber Sie können diesen Workflow nicht einfach automatisieren.
Chris Seite
Wir können nach dem Beenden immer den Befehl Q verwenden, der den gesamten Prozess schließt und dann das Terminal schließt.
Optimus Prime
29

Klicken Sie in der Terminal-App auf die Registerkarte Einstellungen >> Profile .

Wählen Sie rechts die Registerkarte Shell . Geben Sie hier die Bildbeschreibung ein

Sie können Nie fragen, bevor Sie schließen, um die Warnung zu unterdrücken.

Blaise
quelle
5
Ich erreichte dies mit When shell exits:"Fenster schließen"
Anup
1
Diese Antwort hat bei mir mit "Nie" nicht funktioniert. Allerdings hat @ Anups Kommentar zu "Fenster schließen" den Trick für mich getan.
Ultimater
12

Eigentlich sollten Sie eine Konfiguration auf Ihrem Terminal festlegen. Wenn Ihr Terminal aktiv ist, drücken Sie +, ,dann sehen Sie den folgenden Bildschirm:

Geben Sie hier die Bildbeschreibung ein

Drücken Sie dann die Shell-Registerkarte und Sie sehen den folgenden Bildschirm:

Geben Sie hier die Bildbeschreibung ein

Wählen Sie nun Close if the shell exited cleanlyfür Wann die Shell beendet wird .

Durch die obige Konfiguration wird exitdas Terminal jedes Mal mit Befehl geschlossen, aber nicht beendet.

AmerllicA
quelle
10

Sie können AppleScript über den folgenden osascriptBefehl verwenden:

osascript -e 'tell application "Terminal" to quit'
icktoofay
quelle
Ich habe den Befehl osascript nicht ausprobiert, aber ich habe zwei Probleme damit: 1. Es dauert ziemlich lange, bis ein Befehl beendet wird. Sollte es nicht einfacher sein? Ich mag in Windows, wie exit die Eingabeaufforderung beendet. 2. Ich werde immer noch aufgefordert, das Terminal zu verlassen. Ich möchte, dass es nur die Bewegungen durchläuft. Ein Fenster öffnete sich und fragte, ob ich wirklich aufhören wollte.
Darksteel
1
@darksteel: 1. Fügen Sie einen Alias ​​in Ihre .bashrc(oder einen gleichwertigen, wenn Sie eine andere Shell verwenden) ein. Ich denke immer noch an eine Antwort auf 2.
icktoofay
Ich denke, Befehl Q funktioniert am besten. Aber ich bin gespannt, wie man einen Alias ​​richtig einrichtet. Es gibt einige Befehle wie "ping google.com", die ich oft genug mache, um einen Alias ​​zu bevorzugen.
Darksteel
@darksteel: Dies ist ein Überdenken, aber um 2 zu verhindern, können Sie einen dämonisierten Prozess starten, der ungefähr eine Sekunde lang schläft, und dann exitnach dem Starten des dämonisierten Prozesses. Nachdem der dämonisierte Prozess eine Sekunde gewartet hat, kann er osascriptwie beschrieben aufgerufen werden.
icktoofay
@darksteel: Sie können auch einen Tastendruck auslösen über osascript: tell application "System Events" to keystroke "a" using command down. Dies wird wahrscheinlich auch das Problem haben.
icktoofay
9

In einem Terminalfenster können Sie Folgendes eingeben:

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

Dadurch wird der Terminalanwendungsprozess beendet, der das übergeordnete Element des übergeordneten Prozesses des aktuellen Prozesses ist, wie der Befehl kill zeigt.

Um ein Terminalfenster in einem laufenden Skript zu schließen, müssen Sie eine weitere Ebene in der Prozesshierarchie wie folgt aufsteigen:

kill -9 $(ps -p $(ps -p $PPID -o ppid=) -o ppid=) 
GOTO 0
quelle
7
Zu Ihrer Information, diese Lösung tötet auch andere Terminalfenster.
Tresf
Und verwenden kill -9Sie es nur, wenn Sie wissen, dass andere Signale nicht funktionieren.
Tripleee
9

Ich habe benutzt ctrl + d. Es bringt Sie an das Ziel, an dem Sie den Befehl sqlite3 überhaupt gestartet haben.

Kalafun
quelle
5

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

Dies simuliert einen CMD+ wTastendruck.

Wenn Sie möchten, dass Terminal vollständig beendet wird, können Sie Folgendes verwenden: osascript -e "tell application \"System Events\" to keystroke \"q\" using command down"

Dies gibt keine Fehler und lässt das Terminal sauber anhalten.

insanikov
quelle
4

Sie können auch diesen verschlungenen Befehl verwenden, der keine Warnung zum Beenden des eigenen Prozesses auslöst:
osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit

Dieser Befehl ist ziemlich lang, sodass Sie einen Alias ​​(z. B. quit) in Ihrem Bash-Profil definieren können:
alias quit='osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit'

Auf diese Weise können Sie einfach quitin das Terminal eingeben, ohne an anderen Einstellungen herumspielen zu müssen.

David P.
quelle
2

Verwenden Sie den osascriptBefehl in Ihrem Code wie folgt:osascript -e 'tell application "Terminal" to quit'

Öffnen Sie dann die Terminaleinstellungen, gehen Sie zu Einstellungen> Shell und setzen Sie "Vor dem Schließen auffordern:" auf "Nie". Das Terminal sollte jetzt vollständig beendet werden (nicht in Ihrem Dock geöffnet bleiben) und die Eingabeaufforderung vor dem Beenden ignorieren. Wenn nur ein Terminalfenster geöffnet ist und der osascriptBefehl Ihre letzte Codezeile ist, sollte er warten, bis der zuvor ausgeführte Befehl abgeschlossen ist.

Dies ist nicht ideal, wenn Sie Skripte im selben Fenster oder in anderen Fenstern im Hintergrund ausführen (z. B. können Sie einen Befehl im Hintergrund ausführen und das aktuelle Fenster weiterhin für andere Befehle verwenden, wenn auf den ersten Befehl ein kaufmännisches Und folgt ); Achtung!

Wenn Sie den osascriptCode in eine Shell-Skriptdatei einschließen, können Sie ihn wahrscheinlich mit dem markigen Dateinamen aufrufen, den Sie ihm geben - solange er sich im Suchpfad des Terminals befindet (führen Sie ihn aus, um echo $PATHzu sehen, wo Terminal nach Skripten sucht).

John
quelle
1

Erstellen Sie ein Skript:

cat ~/exit.scpt

so was:

  • Hinweis: Wenn nur ein Fenster vorhanden ist, beenden Sie einfach die Anwendung, und simulieren Sie command + w, um die Registerkarte zu schließen.

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

Fügen Sie dann einen Alias ​​in Ihren * shrc ein

genau wie vi ~/.bashrcoder zshrc(noch etwas?)

füge es hinzu: alias exit="osascript ~/exit.scpt"

Und geben Sie die ~ / .bashrc-Quelle ein oder öffnen Sie Ihre terminal.app erneut

Sünde
quelle
0

Ich habe benutzt

Beenden Sie -n Terminal

am Ende meiner Skripte. Sie müssen das Terminal so eingestellt haben, dass keine Einstellungen vorgenommen werden

Also Terminal> Einstellungen> Einstellungen> Shell Wenn die Shell beendet wird Schließen Sie das Fenster Eingabeaufforderung, bevor Sie Nie schließen

Jon
quelle
0

Ich habe hier verschiedene Variationen der Antworten ausprobiert. Egal was ich versuche, ich kann immer einen Anwendungsfall finden, in dem der Benutzer aufgefordert wird, Terminal zu schließen.

(Da mein Skript ist ein einfaches drutil -drive 2 tray open- ein bestimmtes DVD - Laufwerk zu öffnen), muss der Benutzer nicht die Terminal - Fenster , während des Skript ausgeführt werden sehen müssen.

Meine Lösung bestand darin, das Skript in eine App umzuwandeln, die das Skript ausführt, ohne ein Terminalfenster anzuzeigen. Der zusätzliche Vorteil besteht darin, dass bereits geöffnete Terminalfenster geöffnet bleiben. Wenn keines geöffnet ist, bleibt das Terminal nach dem Ende des Skripts nicht mehr resident. Es scheint überhaupt kein Terminal zu starten, um das Bash-Skript auszuführen.

Ich habe diese Anweisungen befolgt, um mein Skript in eine App umzuwandeln : https://superuser.com/a/1354541/162011

James L.
quelle
-3

Wenn es sich um einen Mac handelt, geben Sie 'exit' ein und drücken Sie die Eingabetaste.

Tremaine
quelle