【问题标题】:Waiting for do shell script to finish等待 do shell 脚本完成
【发布时间】:2013-11-22 13:28:16
【问题描述】:

我正在尝试使用 Applescript 在 Xcode 中创建一个应用程序来转换 PDF。

问题是我需要 Xcode/AppleScript 等待每个“执行 shell 脚本”命令完成处理,然后再开始下一个。

有没有办法检测到每个脚本都完成了?

例如

tell application "System Events"
        do shell script "/opt/local/bin/convert task1.tif output1.pdf"
    end tell

tell application "System Events"
        do shell script "/opt/local/bin/convert task2.tif output2.pdf"
    end tell

谢谢, 安东尼

【问题讨论】:

    标签: xcode applescript


    【解决方案1】:

    首先,从“系统事件”代码块中删除“执行 shell 脚本”行。 “do shell script”命令不需要系统事件。

    接下来,您可以强制 applescript 不等待 shell 命令完成,并在 applescript 中获取命令的 PID(进程 ID)。例如,运行此命令。

    do shell script "/bin/sleep 5"
    

    您会看到这是一个基本的 5 秒延迟命令,applescript 将等待这 5 秒,然后将控制权返回给脚本。

    现在运行这个命令。

    do shell script "/bin/sleep 5 > /dev/null 2>&1 & echo $!"
    

    您会看到现在 applescript 没有等待 5 秒,而且您还获得了正在运行的 sleep 命令的 PID。请注意我们添加到原始命令末尾以实现这一点的内容。

    我们可以使用这个 PID。我们可以重复循环并使用“ps”命令检查 PID 是否仍在运行。当 sleep 命令完成时,PID 将不再存在,我们可以使用它作为触发器来了解 sleep 命令何时完成。

    set thePID to do shell script "/bin/sleep 5 > /dev/null 2>&1 & echo $!"
    
    repeat
        do shell script "ps ax | grep " & thePID & " | grep -v grep | awk '{ print $1 }'"
        if result is "" then exit repeat
        delay 0.2
    end repeat
    
    return "the process is complete!"
    

    因此,这应该为您提供实现目标的工具。祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      相关资源
      最近更新 更多