OSX - Як автоматично закрити вікно терміналу після виконання команди «вихід».


104

Коли я закінчую з Терміналом, я хочу вийти з нього. Зараз у мене є три варіанти:

  1. Кіллалл Термінал. Це закінчить процес, але досить різко. Я не думаю, що це найкраща ідея.

  2. Виклик виходу. Я змінив налаштування, тому вихід закривається терміналом. Додаток, як і раніше, відкривається в доці, і не робить те, що я хочу.

  3. Клацніть правою кнопкою миші> Вийти. Однак це не команда терміналу для виходу з неї.

Отже, яким чином я повинен вийти та закрити Термінал? Я чув щось про osascript, але не дуже впевнений. Я хочу вийти і закрити, щоб Термінал більше не був відкритим і як вікно, і як процес.


Мовляв kill, killallза замовчуванням для надсилання SIGTERM, які можна зловити. Деякі програми ловлять це, прибирають за собою і виходять витончено. Не маю уявлення, чи Terminal.appє серед них. Однак, я підозрюю, що це було б краще в Ask Different або Super User в невеликій мірі, оскільки він, схоже, не має програмного вмісту.
dmckee --- кошеня колишнього модератора

1
Я думаю, що питання було б краще сформульовано «Як вийти з терміналу після виходу останньої оболонки?».
Кріс Пейдж

Відповіді:


194

у Terminal.app

Налаштування> Профілі> (Виберіть профіль)> Оболонка.

у розділі "Коли оболонка виходить" вибрано "Закрити вікно"


@PrabhuKonchada не буде занадто страшним, якби ти хотів використати цей простір для подачі користувальницьких даних, але в іншому випадку відповідь інсанікова зробила б для мене чудовий штраф
Frankenmint

Очевидний і чистий, ідеальний.
айдінугур

12
У нових версіях ОС X цей параметр можна знайти у розділі "Налаштування> Профілі> (Вибір профілю)> Оболонка.
XtraSimplicity

Ви можете скористатися посиланням для отримання більш детальної та покрокової інформації про крок.com cnet.com/news/terminal-tip-close-windows-after-clean-exit
Кришан Кумар Мурія

1
Ви також можете вибрати всі профілі та внести зміни відразу до всіх.

31

Як щодо старого доброго Command-Q?


Він має на увазі команду Q. Хоча це хороший метод? Мені це здається не іншим, ніж кілла.
darksteel

@darksteel: Command-Q - це правильний спосіб закрити додаток на Mac. Зробити кіллалл, ймовірно, добре, оскільки додаток наказано закінчувати чисто.
tomlogic

2
Так, я мав намір набрати "Command", але він вийшов як Ctrl. Я б сказав, що це справа PEBBAF (Проблема існує між мозку і кінчиками пальців).
Holygeek

kill / killall, як правило, не є гарним способом закрити додаток. Це може відмовитись від збереженого стану або зберегти стан, який не відображає правильно, як виглядала б програма, якби ви кинули це. У Mac OS X є функція "Раптове припинення", коли програми можуть вказувати, коли вони знаходяться в стані, коли їх безпечно вбивати (фактично з SIGKILL), і якщо ви перевіряли стан Терміналу за допомогою Монітора активності, щоб перевірити, що спочатку його безпечно вбити (покажіть стовпець «Раптове припинення» та шукайте «Так»), ви можете це зробити, але ви не можете легко автоматизувати цей робочий процес.
Кріс Пейдж

Ми завжди можемо використовувати команду-Q після виходу, яка закриває весь процес, а потім закриває термінал.
Optimus Prime

29

У додатку Термінал, вкладка Налаштування >> Профілі .

Виберіть вкладку « Оболонка » праворуч. введіть тут опис зображення

Ви можете вибрати Ніколи не питати перед закриттям, щоб придушити попередження.


5
Я домігся цього, When shell exits:«закривши вікно»
Ануп

1
Ця відповідь не спрацювала для мене, вибравши "Ніколи". Однак коментар @ Anup про "Закрити вікно" зробив для мене трюк.
Ultimater

12

Насправді вам слід встановити конфігурацію на своєму терміналі, коли термінал увімкнути натисніть +, ,ви побачите нижче екран:

введіть тут опис зображення

Потім натисніть на вкладку оболонки, і ви побачите нижче екран:

введіть тут опис зображення

Тепер виберіть Close if the shell exited cleanlyдля, коли оболонка виходить .

За вищенаведеною конфігурацією щоразу із exitкомандою Термінал закриється, але не вийде.


10

Ви можете використовувати AppleScript за допомогою osascriptкоманди:

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

Я не пробував команду osascript, але у мене з цим два питання: 1. Команда досить триває. Чи не повинно бути простіше? Мені подобається в Windows, як завершується вихід командного рядка. 2. Це все ще спонукає мене покинути Термінал. Я хочу, щоб це просто пройшло через рухи. Підійшло вікно із запитанням, чи справді я хочу вийти.
darksteel

1
@darksteel: 1. Додайте псевдонім у свій .bashrc(або еквівалент, якщо ви використовуєте іншу оболонку). Я все ще думаю про відповідь на 2.
icktoofay

Я думаю, що команда Q працює найкраще. Але мені цікаво, як правильно встановити псевдонім. Існує кілька команд на кшталт "ping google.com", які я виконую досить часто, щоб я міг віддати перевагу псевдоніму.
darksteel

@darksteel: Це спосіб її переосмислення, але, щоб запобігти 2, ви можете почати демонізований процес, який спить близько секунди, а потім exitпісля запуску демонізованого процесу. Після того, як демонізований процес зачекав секунду, він може зателефонувати osascriptяк описано.
icktoofay

@darksteel: Ви можете також викликати через натискання клавіші osascript: tell application "System Events" to keystroke "a" using command down. З цим, мабуть, буде і проблема.
icktoofay

9

У вікні терміналу ви можете ввести:

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

Це призведе до вбивства процесу застосування терміналу, який є основним батьком поточного процесу, як видно з команди kill.

Щоб закрити вікно терміналу всередині запущеного сценарію, вам потрібно піднятися ще на один рівень в ієрархії процесів, як це:

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

7
FYI, це рішення також вбиває і інші термінальні вікна.
tresf

І не використовуйте, kill -9якщо ви не знаєте, що інші сигнали не спрацюють.
трійка

9

Я використовую ctrl + d. Це викидає вас до місця призначення, де ви в першу чергу запустили команду sqlite3.


5

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

Це імітує клавішу CMD+ w.

Якщо ви хочете, щоб термінал повністю вийшов, ви можете скористатися: osascript -e "tell application \"System Events\" to keystroke \"q\" using command down"

Це не дає жодних помилок і змушує Термінал чисто зупинятися.


4

Ви також можете скористатися цією складеною командою, яка не викликає попередження про припинення власного процесу:
osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit

Ця команда досить довга, тому ви можете визначити псевдонім (наприклад quit) у вашому баш-профілі:
alias quit='osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit'

Це дозволить вам просто ввести quitтермінал, не поспішаючи з будь-якими іншими налаштуваннями.


2

Використовуйте osascriptкоманду у своєму коді як згадувану icktoofay:osascript -e 'tell application "Terminal" to quit'

Потім відкрийте налаштування терміналу, перейдіть у Налаштування> Оболонка та встановіть "Підказка перед закриттям" на "Ніколи". Тепер термінал повинен повністю вийти (не залишатися відкритим у вашому доку) та ігнорувати підказку перед тим, як вийти з нього. Якщо у вас відкрито лише одне вікно терміналу, і osascriptкоманда - ваш останній рядок коду, слід дочекатися того, яку команду ви виконали раніше, щоб закінчити.

Це не було б ідеально, якщо ви використовуєте сценарії в тому ж вікні чи інші вікна у фоновому режимі (наприклад, ви можете запустити команду у фоновому режимі та продовжувати використовувати поточне вікно для інших команд, якщо за першою командою йде амперсанд ); будь обережний!

Якщо ви загортаєте osascriptкод у файл сценарію оболонки, ви, ймовірно, можете викликати його будь-яким піт-файлом-ім'ям, яке ви даєте йому --- до тих пір, поки він знаходиться в шляху пошуку терміналу (запустіть, echo $PATHщоб побачити, де Terminal шукає сценарії).


1

Створіть сценарій:

cat ~/exit.scpt

подобається це:

  • Примітка. Якщо є лише одне вікно, просто закрийте програму, інакше моделюйте, command + wщоб закрити вкладку)

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

Потім додайте псевдонім у свій * shrc

так само vi ~/.bashrcабо zshrc(що-небудь ще?)

додати його: alias exit="osascript ~/exit.scpt"

І введіть джерело ~ / .bashrc або повторно відкрийте свій terminal.app


0

Я використовував

вийти з -n терміналу

наприкінці моїх сценаріїв. У вас повинен бути встановлений термінал, щоб ніколи не підказувати налаштування

Отже, Термінал> Налаштування> Налаштування> Оболонка при виході з оболонки Закрийте вікно підказки перед закриттям Ніколи


0

Тут я спробував кілька варіантів відповідей. Незалежно від того, що я намагаюся, я завжди можу знайти випадок використання, коли користувачеві пропонується закрити Термінал.

Оскільки мій сценарій простий ( drutil -drive 2 tray open- для відкриття певного DVD-накопичувача), користувачеві не потрібно бачити вікно терміналу під час виконання сценарію.

Моє рішення полягало в тому, щоб перетворити скрипт у додаток, який запускає сценарій без відображення вікна терміналу. Додатковою перевагою є те, що будь-які термінальні вікна, які вже відкриті, залишаються відкритими, а якщо жодні не відкриті, термінал не залишається резидентом після закінчення сценарію. Схоже, запуск Terminal взагалі не запускає скрипт bash.

Я дотримувався цих інструкцій, щоб перетворити свій сценарій у додаток: https://superuser.com/a/1354541/162011


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.