在 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
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会睡眠过多并延迟其他应用程序的启动。
或者,如果您知道应用程序正在运行,您可以使用/usr/bin/open:
open -g -W /Applications/TextEdit.app
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果它没有运行,这将打开应用程序。您可以在调用之前检查它是否正在运行/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"'
Run Code Online (Sandbox Code Playgroud)
作为旁注:open -W实际上对进程执行 kqueue 等待(非轮询等待)。可能还有其他命令调用 kqueue 并执行相同的任务,而不会冒重新启动应用程序的风险。在 C 中实现非常容易。
| 归档时间: |
|
| 查看次数: |
2059 次 |
| 最近记录: |