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

Posted

技术标签:

【中文标题】OSX - 如何在“退出”命令执行后自动关闭终端窗口。【英文标题】:OSX - How to auto Close Terminal window after the "exit" command executed. 【发布时间】:2011-07-30 10:21:00 【问题描述】:

当我用完终端后,我想退出它。目前,我有三个选择:

    killall 终端。它将结束该过程,但相当突然。我认为这不是最好的主意。

    呼叫退出。我已经更改了设置,所以 exit 会关闭终端。该应用程序仍然在 Dock 中显示为打开状态,并且没有执行我希望它执行的操作。

    右键单击>退出。但是,这不是退出它的终端命令。

那么现在,我应该以什么方式退出并关闭终端?我听说过一些关于 osascript 的事情,但我不太确定。我想退出并关闭,这样终端就不再打开,无论是作为窗口还是作为进程。

【问题讨论】:

点赞killkillall默认发送SIGTERM,可以被抓到。一些程序捕捉到它,自行清理并优雅地退出。不知道Terminal.app 是否在其中。但是,我怀疑这在 Ask Different 或超级用户上会更好,因为它似乎没有任何编程内容。 我认为这个问题最好用“如何在最后一个 shell 退出后退出终端?”。 Close Terminal window from within shell script (Unix)?的可能重复 【参考方案1】:

在 Terminal.app 中

首选项 > 配置文件 >(选择配置文件)> 外壳。

在“当 shell 退出时”选择了“关闭窗口”

【讨论】:

@PrabhuKonchada 如果您想使用该空间来提供用户输出并不会太糟糕,但否则 insanikov 的回答对我来说会很好 明显干净,完美。 在较新版本的 OS X 中,此选项可在“首选项”>“配置文件”>(选择一个配置文件)>“外壳”下找到。 您也可以选择所有配置文件,然后一次性更改所有配置文件。 在 macOS Sierra 10.13.5 中,还有“如果 shell 干净退出则关闭”选项。此选项也可能存在于早期版本的操作系统中。【参考方案2】:

旧的 Command-Q 怎么样?

【讨论】:

他的意思是命令 Q。但是这是一个好方法吗?在我看来,这与 killall 没什么不同。 @darksteel:Command-Q 是在 Mac 上关闭应用程序的正确方法。执行 killall 可能也可以,因为应用程序被告知干净地终止。 是的,我的意思是输入“命令”,但它显示为 Ctrl。我会说这是一个 PEBBAF 的案例(大脑和指尖之间存在问题)。 kill/killall 通常不是终止应用程序的好方法。这可能会丢弃未保存的状态,或者保存的状态不能正确反映应用程序在您退出时的外观。 Mac OS X 确实具有“突然终止”功能,程序可以指示它们何时处于可以安全杀死它们的状态(实际上是使用 SIGKILL),并且如果您使用活动监视器检查终端的状态以验证首先杀死它是安全的(显示“突然终止”列并寻找“是”),然后您可以这样做,但您不能轻松地自动化该工作流程。 我们总是可以在退出后使用command-Q,关闭所有进程,然后关闭终端。【参考方案3】:

在终端应用程序中,Preference >> Profiles 选项卡。

选择右侧的 Shell 标签。

您可以选择从不关闭前询问以取消警告。

【讨论】:

我通过When shell exits: "close the window" 实现了这一目标 选择“从不”这个答案对我不起作用。但是@Anup 关于“关上窗户”的评论对我有用。【参考方案4】:

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

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

现在为 Shell 退出时选择Close if the shell exited cleanly

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

【讨论】:

在我的情况下这并不能解决太多问题。实际上,初始窗口确实关闭了,但随后会打开一个新的终端窗口。 @Lethargos,什么?我不明白你的问题!请再解释一下。 我将应用程序 (firefox) 作为 shell 脚本运行,因为我想选择添加 cli 参数 (-P profile_name)。为了让它在 finder 中工作,我添加了“.command”扩展名。我设置了“如果外壳完全退出则关闭”选项。其结果是初始窗口确实存在,但终端(实际上)保持打开状态。而已。 (mbp m1,蒙特雷 12.0.1) @Lethargos,这是一个非常重要的案例,我认为最好发布一个关于这个问题的问题,答案是使用& 关闭.command 文件。我可以帮你。如果您同意,请发布一个带有足够解释和屏幕截图的问题,我将在此处发送完整描述的答案并附上一个很好的例子。 我正在使用&nohup。但是,是的,我打算发布一个关于这个的问题,因为我还没有在互联网上找到其他任何东西。所以我会尽快做的:)【参考方案5】:

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

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

【讨论】:

我没有尝试过 osascript 命令,但是我有两个问题: 1. 命令退出的时间相当长。不应该更简单吗?我喜欢在 Windows 中 exit 如何终止命令提示符。 2.它仍然提示我退出终端。我希望它只是通过动作。出现一个窗口,询问我是否真的想退出。 @darksteel: 1. 在你的.bashrc 中添加一个别名(如果你使用不同的shell,则添加一个别名)。我仍在考虑 2 的答案。 我认为命令 Q 效果最好。但我很好奇如何正确设置别名。我经常使用一些命令,例如“ping google.com”,因此我可能更喜欢别名。 @darksteel:这有点想多了,但为了防止 2,你可以启动一个休眠大约一秒钟的守护进程,然后在启动守护进程后 exit。在守护进程等待一秒钟后,它可以调用osascript,如所述。 @darksteel:你也可以通过osascript触发按键:tell application "System Events" to keystroke "a" using command down。不过,这可能也会有问题。【参考方案6】:

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

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

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

要从正在运行的脚本中关闭终端窗口,您需要在进程层次结构中再上一层,如下所示:

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

【讨论】:

仅供参考,这个解决方案也会杀死其他终端窗口。 除非你知道其他信号不起作用,否则不要使用kill -9【参考方案7】:

我一直在使用ctrl + d。它会将您带到您首先启动 sqlite3 命令的目的地。

【讨论】:

【参考方案8】:

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"

这不会产生任何错误并使终端完全停止。

【讨论】:

【参考方案9】:

你也可以使用这个复杂的命令,它不会触发终止自己进程的警告: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,而无需摆弄任何其他设置。

【讨论】:

【参考方案10】:

在您的代码中使用 osascript 命令,如 icktoofay 所述:osascript -e 'tell application "Terminal" to quit'

然后,打开终端首选项,转到设置> Shell,然后将“关闭前提示:”设置为“从不”。终端现在应该完全退出(不在您的扩展坞中保持打开状态)并在退出前忽略提示。如果您只打开一个终端窗口并且osascript 命令是您的最后一行代码,它应该等待您之前运行的任何命令完成。

如果您在同一窗口或后台的其他窗口中运行脚本,这将不理想(例如,您可以在后台运行命令并继续使用当前窗口执行其他命令,如果第一个命令被执行由 & 号);小心!

如果您将 osascript 代码包装在一个 shell 脚本文件中,您可能可以使用您给它的任何简洁的文件名来调用它——只要它在终端的搜索路径中(运行 echo $PATH 以查看终端在哪里寻找脚本)。

【讨论】:

【参考方案11】:

我一直在用

退出 -n 终端

在我的脚本末尾。您必须将终端设置为从不提示首选项

所以终端>首选项>设置>外壳 shell 退出时 关闭窗口 关闭前提示 从不

【讨论】:

【参考方案12】:

创建脚本:

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 ~/.bashrczshrc(还有什么?)

添加它: alias exit="osascript ~/exit.scpt"

并获取 ~/.bashrc 或重新打开您的 terminal.app

【讨论】:

【参考方案13】:

我在这里尝试了几种不同的答案。无论我尝试什么,我总能找到提示用户关闭终端的用例。

由于我的脚本很简单(drutil -drive 2 tray open -- 打开特定的 DVD 驱动器),用户确实不需要在脚本运行时需要查看终端窗口。

我的解决方案是将脚本变成一个应用程序,该应用程序运行脚本而不显示终端窗口。额外的好处是任何已经打开的终端窗口都保持打开状态,如果没有打开,则终端在脚本结束后不会保持常驻。它似乎根本没有启动终端来运行 bash 脚本。

我按照这些说明将我的脚本变成了一个应用程序:https://superuser.com/a/1354541/162011

【讨论】:

【参考方案14】:

这就是我为刚刚编写的命令所做的。我希望能够为可在不同计算机上运行的 Apple Configurator 创建备份目录的“快捷方式”,但由于它与用户的主目录相关,因此我需要将其设为 .command 文件。以下是内容:

#!/usr/bin/env bash

open "$HOME/Library/Application Support/MobileSync/Backup"
(sleep 0.1 ; osascript -e 'tell application "Terminal" to quit') &

【讨论】:

【参考方案15】:

如果这是 Mac,请键入“退出”,然后按回车键。

【讨论】:

以上是关于OSX - 如何在“退出”命令执行后自动关闭终端窗口。的主要内容,如果未能解决你的问题,请参考以下文章

linux后台任务执行

nohup执行后退出终端为何进程消失?急

nohup命令执行推出后进程退出

nohup命令执行退出后进程退出

linux中nohup 与 & 的区别

cmd 运行完成后自动关闭