首页 > 解决方案 > 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 中执行此操作?

标签: applescript

解决方案


请注意,我没有该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

推荐阅读