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.
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
.bashrc
oder 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.
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 quit
oder exit
) in Ihrem Profil definieren:
alias quit='osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit'
Sie brauchen trap
kein Signal.
Fügen Sie einfach den osascript-Befehl in Ihre ~/.bash_logout
Datei ein (erstellen Sie ihn, wenn er nicht existiert)
osascript -e "tell application \"Terminal\" to quit"
Die .bash_logout
wird 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.
Martin Marconcini
BinaryMisfit