敢说敢作敢为, 无怨无恨无悔。这篇文章主要讲述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 telltell 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
实用程序(您忽略了提供链接的功能),所以我无法对此进行测试,但它应该可以正常使用。【AppleScript-等待shell脚本完成】首先(正如vadian在评论中指出的那样),在使用它们时,您不需要系统事件告诉块,因此,我对其进行了重组。这里的技巧是分离movinfo实用程序,以便它作为独立于脚本的进程运行,将电影信息写入
~/movieInfo.txt
的文件中。然后,脚本使用[系统事件]从do shell script
中恢复进程pid,并等待实用程序结束,以测试具有该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
推荐阅读
- Android字体可下载,我如何从常规更改为semibold
- 找不到模块'./app/server.app.module.ngfactory'
- 在为arm64 Android手机构建应用程序包时,在ApplicationInfo.nativeLibraryDir中找不到本机库
- 尝试使用Android Brother Sdk打印无线时,ERROR_WRONG_LABEL用于标签打印机
- Android 9上的BiometricManager
- 在appkit中禁用右键单击
- 如何在Android中停止可运行线程()
- java.lang.NoClassDefFoundError(部署到Google App Engine时无法初始化类net.sf.cglib.proxy.Enhancer。)
- Jquery在混合android中不起作用,但在网络中起作用