在 OS XI 上,想要执行一个 osascript 命令,该命令等待直到由其完整 .app 路径指定的某个应用程序退出,然后启动另一个应用程序,例如使用/usr/bin/open -n /Applications/MyApp.app
.
如何实现等待应用退出?
一种常见的方法是执行等待循环,例如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 中很容易实现。