Beenden Sie Terminal automatisch, wenn Sie exit eingeben

Szenario

Ich verwende häufig Terminal für SSH, möchte jedoch, dass die Terminal-App beendet wird, wenn der letzte Tab mit exit geschlossen wird. Ich habe bereits das Terminalfenster selbst so eingestellt, dass es bei erfolgreichem Beenden geschlossen wird, Terminal läuft jedoch weiter. Ich habe Ricky Campbells Tutorial hier befolgt, das ein AppleScript zum Beenden des Terminals verwendet. Das AppleScript funktioniert perfekt, wenn es außerhalb von Terminal ausgeführt wird, aber ich kann den Trap-Befehl irgendwie nicht zum Laufen bringen, der im Terminal platziert werden muss.

Als Referenz werde ich den entsprechenden Text hier posten:

Jetzt brauchen wir eine Möglichkeit, das Skript zu starten. Dies kann mit dem Bash-Befehl „trap“ erfolgen, der auf das EXIT-Signal lauscht. Da ich möchte, dass dies jedes Mal geschieht, wenn mein Benutzer eine Shell öffnet, füge ich es meiner .profile-Datei hinzu. Ich mache das mit Nano:

$ nano ~/.profile

Fügen Sie in dieser Datei Folgendes irgendwo hinzu. Möglicherweise müssen Sie den Pfad zu der zuvor erstellten AppleScript-Datei bearbeiten:

trap '/usr/bin/osascript $HOME/Scripts/QuitTerminal.scpt' BEENDEN

Alles, was dies tut, ist, auf das EXIT-Signal innerhalb von Bash zu warten und, wenn es es erhält, das zuvor erstellte Skript auszuführen.

Frage

Wie gehe ich vor, um dieses Problem zu beheben. Aus irgendeinem Grund feuert oder funktioniert die Falle nicht so, wie sie sollte, selbst nach zahlreichen Neustarts. Gibt es eine alternative Möglichkeit, die Terminal-App zu schließen, wenn der letzte Tab beendet wird?

Lösung

Die von Dori bereitgestellten Links führten zur Lösung. Der Artikel schlägt vor , dass der Trap - Befehl in sein sollte .profile, obwohl er tatsächlich in platziert werden muss .bashrc. Das Verschieben in das richtige Skript hat das Problem behoben.

Haben Sie den Trap-Befehl zu Ihrem /Users/YourUsername/.profile hinzugefügt?
@Martin Ja habe ich. Ich habe jetzt ein paar Mal bestätigt.

Antworten (4)

Der hier gegebene Ansatz sieht etwas einfacher aus – vielleicht würde er für Sie funktionieren?

Wenn Sie nicht daran denken möchten, "quit" anstelle von "exit" einzugeben, und Sie Bash verwenden, fügen Sie einfach Folgendes zu Ihrem .bashrcoder einem anderen Shell-Startskript hinzu:

trap '/usr/bin/osascript -e "tell application \"terminal\" to quit"' 0

Was macht es? Wenn die Shell das Signal 0 (Null) empfängt, das heißt, zum Beenden aufgefordert wird, führt sie diesen Befehl als letztes aus, was sie tut. Dadurch kann Ihre Shell usw. ordnungsgemäß beendet werden, und wenn Sie Terminal.app über Applescript zum Beenden auffordern, wird sichergestellt, dass es dasselbe tut. Mit anderen Worten, geben Sie 'exit' ein, und Ihre Shell wird beendet, dann wird Terminal beendet, alles sauber und so, wie es die Natur vorgesehen hat.

Den vollständigen Thread finden Sie hier .

Danke schön. Da war die Lösung drin. Ich hatte den Trap-Befehl in .profile und nicht in .bashrc. Das Verschieben hat das Problem vollständig behoben und es funktioniert jetzt wie erwartet.
Es gibt auch eine Registerkarte in den Einstellungen namens Shell. Wenn Sie „Wenn die Shell beendet wird:“ in „Schließen, wenn die Shell sauber beendet wurde“ ändern, geschieht dies ohne jegliches Skripting.
@atroon Ich denke, dass pref für das Schließen eines Terminalfensters gilt, nicht für die gesamte Terminal-App.

Sie können auch diesen komplizierten Befehl verwenden, der keine Warnung über das Beenden seines eigenen Prozesses auslöst:

osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit

Oder Sie könnten einen Alias ​​(wie quitoder exit) in Ihrem Profil definieren:

alias quit='osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit'

Sie brauchen trapkein Signal.

Fügen Sie einfach den osascript-Befehl in Ihre ~/.bash_logoutDatei ein (erstellen Sie ihn, wenn er nicht existiert)

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

Die .bash_logoutwird von bash ausgeführt, nachdem Sie sich abgemeldet haben. In diese Datei können Sie beliebige Shell-Befehle eingeben, die beim Abmelden ausgeführt werden.

Beispielsweise können Sie ein Finder-Fenster in dem Ordner öffnen, in dem Sie sich zuletzt vor dem Beenden befanden, mit open .oder wie ...

open .
say "Good bye, my master - leaving terminal now, continue with Finder"
osascript -e "tell application \"Terminal\" to quit"

usw...

Ich finde diese URL für Terminal-Fall mit mehreren Registerkarten. http://cyberdork33.wordpress.com/2010/05/25/make-osx-terminal-quit-when-last-window-closed/
gerade getestet auf os x 10.8.2
TL.DR:
für den Tab-Teil (exit zum Schließen des aktuellen Tabs)
Terminal > Einstellungen > Einstellungen > Shell
Wenn die Shell beendet wird: Schließen, wenn die Shell sauber beendet wurde (oder das Fenster schließen)
Vor dem Schließen auffordern: Nie (oder nur, wenn es andere Prozesse als die Anmelde-Shell gibt und: Einfügen " Osaskript")

für den letzten Registerkartenteil (Beenden, um diese letzte Registerkarte und ganze Terminalfenster zu schließen und Terminal.app zu beenden):
1) anhängen an ~/.bash_profile:

trap '/usr/bin/osascript $HOME/Scripts/QuitTerminal.scpt' EXIT

2) Erstellen Sie Scripts/QuitTerminal.scpt

tell application "Terminal"
    # If there is only one tab remaining, and it contains the word "logout"
    # then this is the final window
    if (count of (tabs of (every window whose visible is true))) = 1 then
        try
            set theContents to words of ((contents of tab 1 of window 1) as Unicode text)
            set exitLastTab to (theContents contains "logout")
        on error
            set exitLastTab to false
        end try

        if exitLastTab is true then
            quit
        end if

    else if (count of (tabs of (every window whose visible is true))) < 1 then
        # If no window remains open, then obviously we can quit the app.
        # This would occur when the final window is closed without 'exit'
        quit
    end if
end tell

Ich hoffe es hilft.

Während Ihre Antwort die Frage theoretisch beantworten könnte, wäre es vorzuziehen , die wesentlichen Teile des Artikels in eine Antwort unten aufzunehmen und den Link als Referenz bereitzustellen