在OS X上我想执行一个osascript命令,该命令等待其完整.app路径指定的某个应用程序退出,然后启动另一个应用程序,例如使用/usr/bin/open -n /Applications/MyApp.app
。
如何在应用程序退出之前实现等待?
答案 0 :(得分:3)
常见的方法是执行等待循环,例如使用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中实现起来非常容易。