OSX - Jak automatycznie zamknąć okno terminala po wykonaniu polecenia „exit”.

104

Kiedy skończę z Terminalem, chcę go zamknąć. W tej chwili mam trzy opcje:

  1. killall Terminal. Zakończy to proces, ale raczej nagle. Nie sądzę, żeby to był najlepszy pomysł.

  2. Zadzwoń do wyjścia. Zmieniłem ustawienia, więc wyjście zamyka Terminal. Jednak aplikacja nadal wygląda na otwartą w Docku i nie robi tego, co chcę.

  3. Kliknij prawym przyciskiem myszy> Zakończ. Jednak nie jest to polecenie terminala, aby go zamknąć.

Więc jak mam wyjść i zamknąć Terminal? Słyszałem coś o osascript, ale nie jestem pewien. Chcę wyjść i zamknąć, aby Terminal nie był już otwarty, zarówno jako okno, jak i jako proces.

Ciemna stal
źródło
Na przykład kill, killalldomyślnie wysyłanie SIGTERM, które można złapać. Niektóre programy łapią to, czyszczą po sobie i bezpiecznie kończą pracę. Nie mam pojęcia, czy Terminal.appjest wśród nich. Podejrzewam jednak, że byłoby lepiej w Ask Different lub Super User w szczypcach, ponieważ wydaje się, że nie ma żadnych treści programowych.
dmckee --- ex-moderator kitten
1
Myślę, że pytanie byłoby lepiej sformułowane: „Jak zamknąć terminal po wyjściu ostatniej powłoki?”.
Chris Page

Odpowiedzi:

194

w Terminal.app

Preferencje> Profile> (Wybierz profil)> Powłoka.

włączona opcja „Po zamknięciu powłoki” wybrana opcja „Zamknij okno”

Książę
źródło
@PrabhuKonchada nie byłoby zbyt straszne, gdybyś chciał wykorzystać tę przestrzeń do przesyłania danych wyjściowych użytkownika, ale w przeciwnym razie odpowiedź insanikova byłaby dla mnie dobra
Frankenmint
Oczywiste i czyste, idealne.
aydinugur
12
W nowszych wersjach systemu OS X tę opcję można znaleźć w sekcji Preferencje> Profile> (Wybierz profil)> Powłoka.
XtraSimplicity
Można skorzystać z linku na więcej informacji i krok mądry krok cnet.com/news/terminal-tip-close-windows-after-clean-exit
Krishan Kumar Mourya
1
Możesz także zaznaczyć wszystkie profile i wprowadzić zmiany we wszystkich naraz.
31

A co ze starym dobrym Command-Q?

Holygeek
źródło
Ma na myśli rozkaz P. Czy to jednak dobra metoda? Wydaje mi się, że nie różni się to od killall.
darksteel
@darksteel: Command-Q to właściwy sposób na zamknięcie aplikacji na komputerze Mac. Wykonanie killall jest prawdopodobnie również w porządku, ponieważ aplikacja ma się wyczyścić.
tomlogic
2
Tak, chciałem wpisać „Command”, ale wyszło jako Ctrl. Powiedziałbym, że to przypadek PEBBAF (istnieje problem między mózgiem a opuszkami palców).
holygeek
kill / killall nie jest ogólnie dobrym sposobem na zamknięcie aplikacji. Może to odrzucić niezapisany stan lub zapisać stan, który nie odzwierciedla poprawnie wyglądu aplikacji, gdybyś ją zakończył. Mac OS X ma funkcję „Nagłe zakończenie”, w której programy mogą wskazywać, że są w stanie, w którym można je bezpiecznie zabić (w rzeczywistości za pomocą SIGKILL), a jeśli sprawdziłeś stan Terminala za pomocą Monitora aktywności, aby to sprawdzić możesz bezpiecznie go najpierw zabić (pokaż kolumnę „Nagłe zakończenie” i poszukaj „Tak”), możesz to zrobić, ale nie możesz łatwo zautomatyzować tego przepływu pracy.
Chris Page
Zawsze możemy użyć polecenia-Q po wyjściu, które zamyka cały proces, a następnie zamyka terminal.
Optimus Prime
29

W aplikacji Terminal na karcie Preferencje >> Profile .

Wybierz kartę Shell po prawej stronie. wprowadź opis obrazu tutaj

Możesz wybrać opcję Nigdy nie pytaj przed zamknięciem, aby wyłączyć ostrzeżenie.

Blaise
źródło
5
Osiągnąłem to dzięki When shell exits:„zamknij okno”
Anup
1
Ta odpowiedź nie zadziałała w moim przypadku, wybierając „Nigdy”. Jednak komentarz @ Anupa na temat „Zamknij okno” załatwił mi sprawę.
Ultimater
12

Właściwie powinieneś ustawić konfigurację na swoim terminalu, kiedy twój terminal jest włączony, naciśnij +, a zobaczysz poniższy ekran:

wprowadź opis obrazu tutaj

Następnie naciśnij zakładkę powłoki, a zobaczysz poniższy ekran:

wprowadź opis obrazu tutaj

Teraz wybierz Close if the shell exited cleanly dla Po wyjściu powłoki .

Zgodnie z powyższą konfiguracją za każdym razem z exitpoleceniem Terminal zostanie zamknięty, ale nie zostanie zamknięty.

AmerllicA
źródło
10

Możesz użyć AppleScript za pomocą osascriptpolecenia:

osascript -e 'tell application "Terminal" to quit'
icktoofay
źródło
Nie próbowałem komendy osascript, ale mam dwa problemy z tym: 1. Polecenie kończy się dość długo. Czy nie powinno być prostsze? W systemie Windows podoba mi się sposób, w jaki exit kończy wiersz poleceń. 2. Nadal wyświetla monit o zamknięcie Terminalu. Chcę, żeby po prostu wykonywał ruchy. Pojawiło się okno z pytaniem, czy naprawdę chcę rzucić palenie.
darksteel
1
@darksteel: 1. Dodaj alias w swoim .bashrc(lub odpowiednik, jeśli używasz innej powłoki). Nadal myślę o odpowiedzi na 2.
icktoofay,
Myślę, że polecenie Q działa najlepiej. Ale jestem ciekawy, jak poprawnie ustawić alias. Jest kilka poleceń, takich jak „ping google.com”, które robię na tyle często, że wolę alias.
darksteel
@darksteel: To sposób na przemyślenie tego, ale aby zapobiec 2, możesz uruchomić zdemonizowany proces, który zasypia około sekundy, a następnie exitpo uruchomieniu procesu zdemonizowanego. Po tym, jak zdemonizowany proces odczekał sekundę, może wywołać osascriptzgodnie z opisem.
icktoofay,
@darksteel: Można również wywołać poprzez naciśnięcie klawisza osascript: tell application "System Events" to keystroke "a" using command down. Prawdopodobnie będzie to jednak miało problem.
icktoofay,
9

W oknie terminala możesz wpisać:

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

Spowoduje to zabicie procesu aplikacji Terminala, który jest rodzicem nadrzędnym bieżącego procesu, co widać po poleceniu kill.

Aby zamknąć okno terminala z uruchomionego skryptu, musisz przejść o jeden poziom wyżej w hierarchii procesów, jak poniżej:

kill -9 $(ps -p $(ps -p $PPID -o ppid=) -o ppid=) 
GOTO 0
źródło
7
FYI, to rozwiązanie zabija również inne okna terminala.
tresf
I nie używaj, kill -9chyba że wiesz, że inne sygnały nie będą działać.
tripleee
9

Używałem ctrl + d. Wyrzuca cię do miejsca docelowego, w którym uruchomiłeś polecenie sqlite3 w pierwszej kolejności.

kalafun
źródło
5

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

To symuluje naciśnięcie klawisza CMD+ w.

Jeśli chcesz, aby Terminal całkowicie zakończył pracę, możesz użyć: osascript -e "tell application \"System Events\" to keystroke \"q\" using command down"

Nie powoduje to żadnych błędów i sprawia, że ​​terminal zatrzymuje się czysto.

insanikov
źródło
4

Możesz także użyć tego zawiłego polecenia, które nie wyzwala ostrzeżenia o zakończeniu własnego procesu:
osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit

To polecenie jest dość długie, więc możesz zdefiniować alias (taki jak quit) w swoim profilu bash:
alias quit='osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit'

Umożliwiłoby to po prostu wpisywanie quitw terminalu bez konieczności majstrowania przy innych ustawieniach.

David P.
źródło
2

Użyj osascriptpolecenia w swoim kodzie, jak wspomniano w icktoofay:osascript -e 'tell application "Terminal" to quit'

Następnie otwórz preferencje terminala, przejdź do Ustawienia> Powłoka i ustaw „Pytaj przed zamknięciem” na „Nigdy”. Terminal powinien teraz całkowicie zamknąć się (nie pozostawać otwarty w doku) i zignorować monit przed zamknięciem. Jeśli masz otwarte tylko jedno okno terminala, a osascriptpolecenie jest ostatnim wierszem kodu, powinno poczekać na zakończenie polecenia, które uruchomiłeś wcześniej.

Nie byłoby to idealne, jeśli uruchamiasz skrypty w tym samym oknie lub w innych oknach w tle (na przykład możesz uruchomić polecenie w tle i kontynuować używanie bieżącego okna dla innych poleceń, jeśli po pierwszym poleceniu występuje ampersand ); bądź ostrożny!

Jeśli zawiniesz osascriptkod w pliku skryptu powłoki, prawdopodobnie możesz wywołać go dowolną zwięzłą nazwą pliku, którą mu nadasz --- o ile znajduje się w ścieżce wyszukiwania Terminala (uruchom, echo $PATHaby zobaczyć, gdzie Terminal szuka skryptów).

Jan
źródło
1

Utwórz skrypt:

cat ~/exit.scpt

lubię to:

  • Uwaga: jeśli jest tylko jedno okno, po prostu zamknij aplikację, w przeciwnym razie zasymuluj command + wzamknięcie karty)

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

Następnie dodaj alias w swoim * shrc

tak jak vi ~/.bashrclub zshrc(cokolwiek innego?)

dodaj to: alias exit="osascript ~/exit.scpt"

I uruchom plik ~ / .bashrc lub ponownie otwórz terminal.app

Grzech
źródło
0

Używałem

quit -n terminal

na końcu moich skryptów. Musisz ustawić terminal tak, aby nigdy nie wyświetlał monitów w preferencjach

Więc Terminal> Preferencje> Ustawienia> Powłoka Po zamknięciu powłoki Zamknij okno Pytaj przed zamknięciem Nigdy

Jon
źródło
0

Wypróbowałem tutaj kilka wariantów odpowiedzi. Bez względu na to, co próbuję, zawsze mogę znaleźć przypadek użycia, w którym użytkownik jest proszony o zamknięcie Terminala.

Ponieważ mój skrypt jest prosty ( drutil -drive 2 tray open- aby otworzyć określony napęd DVD), użytkownik tego nie robi musi widzieć okna terminala podczas działania skryptu.

Moim rozwiązaniem było przekształcenie skryptu w aplikację, która uruchamia skrypt bez wyświetlania okna terminala. Dodatkową korzyścią jest to, że wszystkie okna terminala, które są już otwarte, pozostają otwarte, a jeśli żadne nie są otwarte, Terminal nie pozostaje rezydentem po zakończeniu skryptu. Wydaje się, że w ogóle nie uruchamia się Terminala, aby uruchomić skrypt bash.

Postępowałem zgodnie z tymi instrukcjami, aby zmienić mój skrypt w aplikację: https://superuser.com/a/1354541/162011

James L.
źródło
-3

Jeśli jest to komputer Mac, wpisz „zakończ”, a następnie naciśnij klawisz Return.

Tremaine
źródło