OSX - Как автоматически закрыть окно терминала после выполнения команды «exit».

104

Когда я закончу с Терминалом, я хочу выйти из него. Прямо сейчас у меня есть три варианта:

  1. killall Терминал. Это закончит процесс, но довольно резко. Не думаю, что это лучшая идея.

  2. Вызов выхода. Я изменил настройки, поэтому выход закрывает Терминал. Однако приложение по-прежнему отображается открытым в Dock и не выполняет то, что я хочу.

  3. Щелкните правой кнопкой мыши> Выйти. Однако это не команда терминала для выхода из него.

Итак, как мне выйти и закрыть Терминал? Я что-то слышал об osascript, но не совсем уверен. Я хочу выйти и закрыть, чтобы Терминал больше не открывался и как окно, и как процесс.

темная сталь
источник
Мол kill, по killallумолчанию отправка SIGTERM, которую можно поймать. Некоторые программы улавливают это, убирают за собой и корректно завершают работу. Не знаю, есть ли Terminal.appсреди них. Тем не менее, я подозреваю, что в крайнем случае это было бы лучше для « Спроси другого» или «Суперпользователя», поскольку там, похоже, нет никакого программного контента.
dmckee --- котенок экс-модератора
1
Думаю, вопрос лучше сформулировать: «Как выйти из терминала после выхода последней оболочки?».
Крис Пейдж

Ответы:

194

в Terminal.app

Настройки> Профили> (Выбрать профиль)> Оболочка.

на "Когда оболочка выходит" выбрано "Закрыть окно"

Герцог
источник
@PrabhuKonchada не было бы слишком ужасным, если бы вы хотели использовать это пространство для загрузки пользовательского вывода, но в противном случае ответ insanikov был бы прекрасен для меня
Frankenmint
Очевидный и чистый, идеальный.
aydinugur
12
В более новых версиях OS X эту опцию можно найти в разделе «Настройки»> «Профили»> (Выберите профиль)> «Оболочка».
XtraSimplicity
Вы можете использовать ссылку для получения дополнительной и пошаговой информации cnet.com/news/terminal-tip-close-windows-after-clean-exit
Krishan Kumar Mourya
1
Вы также можете выбрать все профили и сразу изменить все.
31

Как насчет старого доброго Command-Q?

Холидик
источник
Он действительно имеет в виду команду Q. Но это хороший метод? Мне кажется, это не что иное, как killall.
darksteel
@darksteel: Command-Q - правильный способ закрыть приложение на Mac. Выполнение killall, вероятно, тоже нормально, так как приложению сказано завершиться чисто.
tomlogic 06
2
Да, я хотел набрать «Command», но получилось Ctrl. Я бы сказал, что это случай PEBBAF (проблема существует между мозгом и кончиками пальцев).
Holygeek
kill / killall, как правило, не лучший способ завершить работу приложения. Это может привести к отмене несохраненного состояния или сохранению состояния, которое неправильно отражает то, как приложение выглядело бы, если бы вы вышли из него. В Mac OS X есть функция «внезапного завершения», при которой программы могут указывать, когда они находятся в состоянии, в котором их можно безопасно убить (на самом деле, с помощью SIGKILL), и если вы проверили состояние терминала с помощью Activity Monitor, чтобы убедиться, что сначала безопасно убить его (покажите столбец «Внезапное завершение» и найдите «Да»), тогда вы можете это сделать, но вы не сможете легко автоматизировать этот рабочий процесс.
Крис Пейдж
Мы всегда можем использовать команду-Q после выхода, которая закрывает весь процесс, а затем закрывает терминал.
Оптимус Прайм
29

В приложении «Терминал» перейдите на вкладку « Настройки» >> « Профили ».

Выберите вкладку Shell справа. введите описание изображения здесь

Вы можете выбрать « Никогда не спрашивать перед закрытием», чтобы отключить предупреждение.

Blaise
источник
5
Я добился этого с помощью When shell exits:«
Ануп
1
Этот ответ не сработал для меня, выбрав «Никогда». Однако комментарий @ Anup о «Закройте окно» помог мне.
Ultimater
12

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

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

Затем нажмите вкладку оболочки, и вы увидите экран ниже:

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

Теперь выберите Close if the shell exited cleanlyдля При выходе из оболочки .

По приведенной выше конфигурации каждый раз с помощью exitкоманды Терминал закрывается, но не закрывается.

AmerllicA
источник
10

Вы можете использовать AppleScript с помощью osascriptкоманды:

osascript -e 'tell application "Terminal" to quit'
icktoofay
источник
Я не пробовал использовать команду 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=) 
GOTO 0
источник
7
FYI, это решение также убивает другие окна терминала.
tresf
И не используйте, kill -9если не знаете, что другие сигналы не работают.
Tripleee
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) в своем профиле bash:
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чтобы увидеть, где Терминал ищет сценарии).

Джон
источник
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-привод), пользователь не нужно видеть окно терминала во время выполнения сценария.

Мое решение заключалось в том, чтобы превратить сценарий в приложение, которое запускает сценарий без отображения окна терминала. Дополнительным преимуществом является то, что любые окна терминала, которые уже открыты, остаются открытыми, а если ни одно из них не открыто, то Терминал не остается в постоянном режиме после завершения скрипта. Кажется, что терминал вообще не запускается для запуска сценария bash.

Я выполнил эти инструкции, чтобы превратить свой скрипт в приложение: https://superuser.com/a/1354541/162011

Джеймс Л.
источник
-3

Если это Mac, вы набираете «выход» и нажимаете return.

Tremaine
источник