如何在OSX中执行“exit”命令后自动关闭终端窗口。

164

当我完成终端的操作后,我想要退出。目前,我有三个选项:

  1. 使用killall Terminal。这会结束进程,但相对突然。我认为这不是最好的选择。

  2. 调用exit命令。我已更改设置,使得exit关闭终端。但该应用程序仍会在Dock中显示,并不能达到我的要求。

  3. 右键点击>退出。但这不是一个退出终端的终端命令。

那么,现在,我应该如何退出和关闭终端呢?我听说过osascript,但我不太确定。我想退出并关闭终端,以便终端不再作为窗口和进程打开。


kill 命令一样,默认情况下,killall 也会发送 SIGTERM 信号,这个信号可以被捕获。一些程序会捕获该信号,清理自己并正常退出,但我不确定 Terminal.app 是否是其中之一。然而,考虑到它似乎没有任何编程内容,若有需要,建议在 Ask Different 或 Super User 上寻求帮助。 - dmckee --- ex-moderator kitten
3
我认为这个问题的措辞更好地是“如何在最后一个 shell 退出后退出终端?”。 - Chris Page
15个回答

276

在Terminal.app中

偏好设置 > 个人资料 > (选择一个个人资料)> Shell。

在“When the shell exits”选项中选择“关闭窗口”


@PrabhuKonchada 如果您想要使用该空间来提供用户输出,那么这并不会太糟糕,但对我来说,insanikov的答案已经足够好了。 - Frankenmint
明显而干净,完美。 - aydinugur
21
在较新的OS X版本中,可以在“偏好设置 > 配置文件 >(选择一个配置文件)> Shell”下找到此选项。 - XtraSimplicity
3
您也可以选择所有个人资料,并一次性更改所有资料。 - user2191247
3
在macOS Sierra 10.13.5中,还有一个选项“如果shell干净地退出,则关闭”。这个选项也可能存在于操作系统的早期版本中。 - DrZoo
显示剩余2条评论

47

实际上,你应该在你的终端上设置一个配置。当你启动终端时,按下 +, 键,然后你会看到下面的屏幕:

enter image description here

然后选择“shell”选项卡,你会看到下面的屏幕:

enter image description here

现在为当 shell 退出时选择关闭窗口选项。

通过以上配置,每次使用exit命令关闭终端时,终端将关闭但不会退出。


这在我的情况下并没有解决太多问题。确实,初始窗口关闭了,但是随后会打开一个新的终端窗口。 - Lethargos
@Lethargos,什么?我不明白你的问题!请再解释详细一点。 - AmerllicA
我将一个应用程序(Firefox)作为shell脚本运行,因为我想选择添加一个cli参数(-P profile_name)。为了使其在Finder中工作,我添加了“.command”扩展名。我设置了“如果shell干净地退出,则关闭”选项。这样做的后果是初始窗口确实存在,但终端实际上仍然保持打开状态。就是这样。(mbp m1,monterey 12.0.1) - Lethargos
@Lethargos,这是一个非常重要的问题,我认为最好发布一个关于这个问题的提问,答案是在.command文件中使用&进行关闭。如果你同意的话,发布一个带有足够解释和截图的问题,我会在那里发送完整描述的答案,并附上一个很好的例子。 - AmerllicA
我正在使用&nohup。但是,是的,我计划发布一个关于这个问题的问题,因为我在互联网上还没有找到其他的东西。所以我很快就会这样做 :) - Lethargos
我已经发布了我的问题 :) - Lethargos

38

那么传统的 Command-Q 怎么样?


他确实是指命令Q。不过这是一个好的方法吗?在我看来,它似乎与killall没有什么区别。 - darksteel
@darksteel:在 Mac 上关闭应用程序的正确方式是使用 Command-Q。执行 killall 也可以,因为该应用程序被告知要清理终止。 - tomlogic
3
我本意是打“命令(Command)”,但打成了Ctrl。这是一个PEBBAF(大脑和手指之间存在问题)的例子。 - holygeek
通常情况下,kill/killall 不是终止应用程序的好方法。这可能会丢弃未保存的状态,或保存不正确反映应用程序退出前状态的状态。Mac OS X确实有一个“突然终止”功能,其中程序可以指示它们处于安全终止状态(实际上使用SIGKILL),如果您使用Activity Monitor检查Terminal的状态以验证它是否可以安全终止(显示“突然终止”列并查找“Yes”),则可以这样做,但您无法轻松地自动化该工作流程。 - Chris Page
我们可以在退出后使用 Command-Q,这将关闭所有进程并关闭终端。 - Optimus Prime

33

在终端应用程序中,点击偏好设置> 配置文件 选项卡。

在右侧选择Shell选项卡。 输入图片描述

您可以选择从不在关闭之前询问以禁止警告。


6
我使用 When shell exits: "close the window" 实现了这一点。 - Anup
1
这个答案对我没用,选择“从不”也一样。然而@Anup的评论“关闭窗口”对我有用。 - Ultimater

18

你可以通过osascript命令使用AppleScript:

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

我之前没有尝试过osascript命令,但是我有两个问题:
  1. 对于一个退出命令来说,它太长了。应该更简单才对。我喜欢Windows中的exit命令可以终止命令提示符。
  2. 它仍然会提示我退出Terminal。我希望它只是按照我的意愿执行。一个窗口弹出来问我是否真的想要退出。
- darksteel
1
@darksteel:1. 在您的.bashrc中添加一个别名(如果您使用不同的shell,则相应更改)。我还在考虑第2个问题的答案。 - icktoofay
我认为命令Q最好用。但我很好奇如何正确设置别名。有一些像“ping google.com”这样的命令,我经常使用,可能更喜欢使用别名。 - darksteel
@darksteel:我刚刚尝试了daemonize方法,显然osascript不喜欢从守护进程运行。老实说,我认为killall就很好用了。 - icktoofay
1
killall 不是试图正常关闭应用程序吗?我很确定它会告诉应用程序关闭并让其尝试关闭,只有在进程无法自行终止时才会突然结束进程。我认为如果没有问题,它将正常终止,然后就不重要了。 - darksteel
显示剩余2条评论

12

在终端窗口中,您可以输入:

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

这将杀死终端应用程序的进程,该进程是当前进程的父进程的父进程,如kill命令所示。

要在运行的脚本内关闭终端窗口,您需要在进程层次结构中再往上一级,像这样:

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

11
这个解决方案会关闭其他终端窗口,请注意。 - tresf
1
除非你知道其他信号不起作用,否则不要使用 kill -9 - tripleee

9

osascript -e "告诉应用程序 \"System Events\" 使用带有命令的键盘击键 \"w\""

这模拟了 CMD + w 键按下。

如果你想要完全退出终端,可以使用以下命令: osascript -e "告诉应用程序 \"System Events\" 使用带有命令的键盘击键 \"q\""

这不会产生任何错误,并使终端干净地停止。


9

我一直在使用ctrl + d。它会将您带回到最初开始使用sqlite3命令的地方。


5
你也可以使用这个复杂的命令,它不会触发有关终止进程的警告:
osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit

这个命令非常长,所以你可以在bash配置文件中定义一个别名(比如quit):
alias quit='osascript -e "do shell script \"osascript -e \\\"tell application \\\\\\\"Terminal\\\\\\\" to quit\\\" &> /dev/null &\""; exit'

这样,你就可以直接在终端中输入quit而不需要调整其他设置。

3
在您的代码中使用osascript命令,如icktoofay所述:osascript -e 'tell application "Terminal" to quit' 然后,打开终端偏好设置,转到"设置">Shell,并将"在关闭之前提示:"设置为"从不"。终端现在应该完全退出(而不是留在dock中)并忽略退出之前的提示。如果您只打开了一个终端窗口,并且osascript命令是您的最后一行代码,则它应该等待您在运行命令之前完成。
如果您在同一个窗口或其他后台窗口中运行脚本(例如,如果您在&符号之后运行第一个命令,则可以在后台运行命令并继续使用当前窗口进行其他命令),则这不是理想的选择;要小心!
如果您将osascript代码包装在shell脚本文件中,您可能可以使用任何短小的文件名调用它,只要它在终端的搜索路径中(运行echo $PATH查看终端查找脚本的位置)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接