1

在 OS XI 上,想要执行一个 osascript 命令,该命令等待直到由其完整 .app 路径指定的某个应用程序退出,然后启动另一个应用程序,例如使用/usr/bin/open -n /Applications/MyApp.app.

如何实现等待应用退出?

4

1 回答 1

6

一种常见的方法是执行等待循环,例如pgrep

while pgrep -f /Applications/TextEdit.app 2>/dev/null ; do sleep 1.0 ; done

不幸的是,这会睡眠过多并延迟其他应用程序的启动。

或者,如果您知道应用程序正在运行,您可以使用/usr/bin/open

open -g -W /Applications/TextEdit.app

不幸的是,如果应用程序没有运行,这将打开应用程序。您可以在调用之前检查它是否正在运行/usr/bin/open,但这不是原子的:它可能正在关闭并且 open 命令可以重新启动它。

两者都可以封装在 osascript 中(尽管它可能没有多大意义)。

osascript -e 'do shell script "while pgrep -f /Applications/TextEdit.app 2>/dev/null ; do sleep 1.0 ; done"'
osascript -e 'do shell script "open -g -W /Applications/TextEdit.app"'

附带说明:open -W实际上对进程执行了 kqueue 等待(非轮询等待)。可能有其他命令调用 kqueue 并执行相同的任务,而不会有重新启动应用程序的风险。在 C 中很容易实现。

于 2014-06-11T15:19:27.140 回答