如何让Mac“.command”文件在运行shell脚本后自动退出?

xxb16uws  于 2023-10-23  发布在  Shell
关注(0)|答案(8)|浏览(374)

在我的shell脚本中,我的最后几行是:

...
echo "$l" done
done

exit

我将终端首选项设置为“当shell退出时:关闭窗口”。在所有其他情况下,当我键入“exit”或“logout”时,在终端中,窗口关闭,但对于这个“.command”文件(我可以双击我的shell脚本文件,脚本运行),而不是关闭窗口,而文件的代码说“exit”,屏幕上显示的是:

...
$l done
logout

[Process completed]

……Windows仍然开着。有人知道如何运行shell脚本,然后在完成时自动退出终端窗口吗?
谢谢你,谢谢

zphenhs4

zphenhs41#

我终于找到了答案。与cobbal的答案类似,它调用了AppleScript,但由于它是我打开的唯一窗口,并且我想运行我的脚本作为快速打开和关闭操作,这种更野蛮的方法对我来说很好。
在“.command”脚本本身中,“...将这一行添加到脚本的末尾”

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

SOURCE:WANG JING

v1l68za4

v1l68za42#

这对我来说很完美。它只是关闭执行窗口,而其他终端窗口则打开
只需打开终端,然后转到终端>首选项>设置> shell :>当shell退出时:->如果shell干净地退出则关闭
然后就加上退出;在你档案的最后

0pizxfdo

0pizxfdo3#

使用“终端>首选项>设置> shell :>当shell退出时:-> Close if the shell exited cleanly'选项,但是

exit 0

作为命令文件的最后一行。这确保了脚本确实“干净地退出”--否则,如果前一个命令没有返回成功,那么窗口将不会关闭。

y1aodyip

y1aodyip4#

除了必须使用上面的AppleScript解决方案之外,这是唯一一个可以工作的shell脚本解决方案(exit没有),即使突然,对我来说(在OS X 10.9中测试):

...
echo "$l" done
done

killall Terminal

当然,这将杀死所有正在运行的终端示例,因此如果您在启动脚本之前正在处理终端窗口,它也将被终止。幸运的是,重新启动Terminal可以让您进入“已恢复”状态,但是,这必须仅在边缘情况下考虑,而不是作为一个干净的解决方案。

7tofc5zh

7tofc5zh5#

在终端应用程序中有一个设置。不幸的是,它是相对于所有终端窗口的,而不仅仅是那些通过.command文件启动的窗口。

f8rj6qna

f8rj6qna6#

你可以使用一些applescript hacking:

tell application "Terminal"
    repeat with i from 1 to number of windows
        if (number of (tabs of (item i of windows) whose tty is "/dev/ttys002")) is not 0 then
            close item i of windows
            exit repeat
        end if
    end repeat
end tell

/dev/ttys002替换为tty

9o685dep

9o685dep7#

我在脚本中使用以下命令
退出-n终端
当然,你必须将终端设置为在关闭前从不提示。

qxgroojn

qxgroojn8#

这种组合的答案对我来说是最好的。我正在使用iTerm2,所以我没有退出整个终端程序的问题。
将终端“关闭前询问”设置为never
Terminal > Settings > Profiles tab > Shell > Ask before closing: never
我添加了一个命令来关闭当前的终端窗口,命令+ w。否则,在每次运行.command文件后,将恢复上一个终端窗口。
终端需要有发送击键的权限。终端应该要求添加此权限,或者您可以在macOS settings > privacy & security > accessibility > Terminal中手动启用它

#!/bin/bash

# ... add your code here ...

# Close the current terminal window with Command + w
osascript -e "tell application \"System Events\" to keystroke \"w\" using command down"

# Close terminal app
osascript -e 'tell application "Terminal" to quit' &
exit

从接受的答案:有人能解释一下为什么没有“在后台运行”选项&就不能很好地工作吗?

相关问题