AppleScript-等待shell脚本完成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的文件中。然后,脚本使用[系统事件]从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

以上是关于AppleScript-等待shell脚本完成的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法通过 Shell 脚本、AppleScript 或 Automator 工作流程触发热键/键盘快捷键?

PHP shell_exec 等待脚本完成? [复制]

使用 shell 脚本或 AppleScript 将子文件夹中特定文件类型的所有文件压缩到每个子文件夹一个文件中

Python subprocess.call 不等待进程完成搅拌机

Python - 调用 perl 作为子进程 - 等待完成其后台进程并打印到 shell

执行脚本sh install.sh后:需要输入1等待5秒并回车,等待10秒输入y并回车 ,如何用脚本完成这两个操作。