从shell脚本(Unix)中关闭终端窗口?

eri*_*oco 55 unix macos shell command

有没有办法从shell脚本中关闭终端窗口?我有一个.command文件,一旦完成就应该完全放弃.

Sim*_*nek 58

使用exit 0将干净地终止脚本.

终端窗口是否保持打开是用户可配置的.默认设置是始终保持打开状态.要改变这个:

Terminal.app > Preferences > Profiles > Shell
    - "When the shell exists:"
        > Close if the shell exited cleanly
    - "Ask before closing:"
        (•) Never
        -- OR --
        (•) Only if there are....
Run Code Online (Sandbox Code Playgroud)

当使用"关闭如果shell干净地退出"时,如果退出结果为0,脚本将关闭窗口,如果没有出错则这是默认值.


小智 23

由于您不想删除所有终端窗口,因此首先将窗口名称从"终端"更改为其他窗口:

echo -n -e"\ 033] 0;我的窗口名称\ 007"

然后在脚本的末尾,使用:

osascript -e'告诉应用程序"终端"关闭(每个名称中包含"我的窗口名称"的窗口)'&

  • @damasio如果将结尾从“&”更改为“&exit”,则不会出现确认对话框 (4认同)

jay*_*ngh 15

您可以使用apple script退出terminal app.将以下内容添加到您的脚本中 -

osascript -e 'tell application "Terminal" to quit'
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个确认关闭应用程序的弹出窗口.您可以在终端首选项中禁用此功能.

或者,您也可以使用killall命令退出应用程序.以下也适用.

killall Terminal
Run Code Online (Sandbox Code Playgroud)

注意:

正如旁注,您可以自由地将上述命令添加到您的脚本中,它可以按您的需要工作.但是,有一些警告.首先,您将限制脚本在不同框中工作的能力.其次,使用它会更安全,nohup因此当前运行的任何命令都不会因为退出而退出Terminal app.

  • ...哇 - 这真是激进 - 杀死所有打开的脚本肯定不是我推荐的.请注意,行为是用户可配置的,所以如果你在*Settings* - >*Shell* - >*中更改你的设置当shell存在*更加理智时"关闭如果shell干净地存在"那么你只需要`exit 0` (或没什么)真的. (3认同)

Arr*_*ron 10

这对我有用:

#!/bin/sh

{your script here}

osascript -e 'tell application "Terminal" to close (every window whose name contains ".command")' &
exit
Run Code Online (Sandbox Code Playgroud)

这将仅用于关闭使用.command文件打开的窗口,但保留已在其他终端窗口中运行的内容.我知道我几乎总是有sass或grunt看东西,所以我不想完全退出终端.

  • 当您还希望终端退出时的变化,但前提是没有更多打开的窗口。`osascript -e '告诉应用程序“终端”' -e '关闭(每个名称包含“.command”的窗口)' -e '如果窗口数 = 0 然后退出' -e '结束告诉' & 退出;`。多个`-e`在脚本中添加换行符;`"\n"` 对我来说有问题。 (2认同)

小智 7

closeWindow() {
    /usr/bin/osascript << _OSACLOSE_
    tell application "Terminal"
        close (every window whose name contains "YourScriptName")
    end tell
    delay 0.3
    tell application "System Events" to click UI element "Close" of sheet 1 of window 1 of application process "Terminal"
_OSACLOSE_
}
Run Code Online (Sandbox Code Playgroud)

这将关闭脚本的终端窗口,并在其窗口标题不匹配时保持其他任何终端窗口打开.要使其工作,必须将终端添加到允许使用Accessibility框架的应用程序列表中.您还可以使用repeat命令在终端窗口中循环,并关闭包含表单1上的UI元素"关闭"的每个窗口x.


Gar*_*ski 6

我发现最好的解决方案是使用Automator创建一个真正的OSX应用程序,无论系统如何配置,该应用程序都将以相同的方式工作。您可以让Automator运行您的Shell脚本,也可以将Shell脚本本身嵌入Automator中。

这是您的操作方式:

  1. 运行Automator(在“应用程序”中)。
  2. 选择“新文档”,当系统询问“选择文档类型”时,选择“应用程序”
  3. 在左侧面板中,选择“实用程序”,然后选择“运行Shell脚本”。
  4. 在右侧面板的工作流程项中键入脚本命令。您可以调用另一个Shell脚本,也可以直接将命令放入其中。
  5. 保存该应用程序,它将是成熟的Mac App。您甚至可以从其他应用程序中剪切和粘贴图标,以使脚本更具个性。