applescript - AppleScript - 等待完成 shell 脚本
问题描述
我编写了一个命令行工具来从 IMDB 获取电影信息。它在 JavaScript 中,称为 movinfo。我在 AppleScript 中运行它:
tell application "System Events"
set movT to "Back-to-the-future"
set exportPath to "export PATH=$PATH:/usr/local/bin:;"
set oriInfo to do shell script exportPath & "movinfo " & quoted form of movT
return oriInfo
end tell
它工作得很好。但有时 movinfo 需要很长时间才能从 Internet 获取信息。所以我想添加一个函数来检查获取是否完成。我首先尝试“忽略...结束忽略”结构:
tell application "System Events"
ignoring application responses
set movT to "Back-to-the-future"
set exportPath to "export PATH=$PATH:/usr/local/bin:;"
set oriInfo to do shell script exportPath & "movinfo " & quoted form of movT
end ignoring
end tell
tell application "System Events"
repeat 30 times
try
return oriInfo
exit repeat
on error
delay 1
end try
end repeat
do shell script "killall System\\ Events"
end tell
但这不起作用。也许我可以使用命令行工具来完成这项工作。但是我真的不太了解 JavaScript 和 CLI。我想在 AppleScript 中执行此操作。希望有人能告诉我代码有什么问题,或者如何在 AS 中执行此操作?
解决方案
请注意,我没有该movinfo
实用程序(您忽略了提供链接),因此我无法对此进行测试,但它应该适用于面值。
首先(正如 vadian 在评论中指出的那样)你不需要系统事件告诉你使用它们的块,所以我已经对其进行了重组。这里的技巧是分离 movinfo 实用程序,使其作为独立于脚本的进程运行,将电影信息写入~/movieInfo.txt
. 然后脚本从 恢复进程 pid do shell script
,并等待实用程序结束,使用系统事件来测试具有该 pid 的进程是否仍在运行。当该过程结束时,脚本将文件中的信息读回oriInfo
变量中。有关 unix 技巧的问题,请参阅:Technote 2065。
-- set output file path
set movieInfoFile to POSIX path of (path to home folder from user domain) & "movieInfo.txt"
set movT to "Back-to-the-future"
set exportPath to "export PATH=$PATH:/usr/local/bin:;"
-- run and detach utility, returning its process id
set procID to do shell script exportPath & "movinfo " & quoted form of movT & " &> " & movieInfoFile & " & echo $!"
repeat 30 times
tell application "System Events"
-- test if pid is still active
set isStillRunning to count of (every process whose unix id is procID)
end tell
if isStillRunning = 0 then
--not active, so proceed
exit repeat
else
delay 1
end if
end repeat
-- pull info from file
set fp to open for access movieInfoFile
set oriInfo to read fp
close access fp
推荐阅读
- ios - SwiftUI UIViewRepresentable,带有参数传递和委托函数
- excel - 基于输入选项自动计算的 Excel 用例模拟
- java - 如何异步运行两个方法,获取结果,在第三种方法中使用并从第三种方法返回结果
- mdbootstrap - 如何避免默认使用 MD Bootstrap 将波浪效果添加为类?
- flutter - 在颤动中以横向视图在一个屏幕中显示多个纵向视图屏幕
- graph - 如何检查给定属性不存在或大于/小于 Gremlin 中的某个值?
- java - SpringBoot.run 报错,不知道为什么会报错
- azure - 了解 Azure OCR 自定义模型的工作原理
- angular - 已编译的 vue.js 或 Angular 组件如何工作?你能像普通的纯 HTML 项目一样使用它吗?
- python - 我在 python 中绘图时遇到 x 刻度标签的问题