我该如何等待一个shell脚本执行完毕?

3

我正在使用一个命令行应用程序在AppleScript中,我需要脚本等待进程运行完毕才能继续。(是的,我想要终端打开并看到应用程序运行。)

我根据一个现有的问题编写了以下代码:

activate application "Terminal"
tell application "System Events"
    repeat until visible of process "Terminal" is true
    end repeat
end tell

tell application "System Events" to keystroke "app_name option"
tell application "System Events" to keystroke return
        
delay 2
        
    set thePID to do shell script "app_name option > /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 2
    end repeat

-- more code...

我的脚本中一切都正常,除了需要等待命令行应用程序完成的部分。

我该如何让它工作?从 set thePID 开始的部分到底是做什么的?


我认为问题出在我在脚本中通过 keystroke 调用应用程序,然后稍后通过运行 set thePID to do shell script "app_name option > /dev/null 2>&1 & echo $!" 来运行它的另一个实例。我猜答案可能是像 tell application "System Events" to keystroke "app_name option > /dev/null 2>&1 & echo $!" 这样的东西。但是当我在终端中尝试时,它基本上只显示了进程,然后就完成了。...还有我想知道是否因为我必须使用 option 运行它,这意味着语法在这里需要不同吗?也许? - DasKraut
1个回答

2
为了使其正常工作,我已经删除了以下内容:
set thePID to do shell script "app_name option > /dev/null 2>&1 & echo $!"

然后在repeat下,我进行了更改:
do shell script "ps ax | grep " & thePID & " | grep -v grep | awk '{ print $1 }'"

to:

do shell script "ps ax | grep app_name | grep -v grep | awk '{ print $1 }'"

现在我的脚本按照我想要的方式工作了!

问题在于我在脚本中通过按键调用了应用程序,然后后来通过运行 set thePID to do shell script "app_name option > /dev/null 2>&1 & echo $!" 基本上运行了一个单独的实例。

我认为答案可能是像 tell application "System Events" to keystroke "app_name option > /dev/null 2>&1 & echo $!" 这样的东西。

我之所以会运行第二个程序实例,是因为我不清楚如何正确地使用我链接到的那篇旧文章中给出的示例。

所以我查找了一下如何在终端中获取正在运行的程序的 PID,并且我看到 grep app_name 是常见的解决方案。同样的还有 ps -ax...

于是我遵循自己的假设,删除了调用程序再次运行的变量,并简单地将该程序的名称插入到字符串的 grep 部分,替换变量。然后它就起作用了。


我之前的评论是正确的,因为我运行了程序的第二个实例,因为我不清楚如何正确地使用我链接到的旧帖子中给出的示例。所以我搜索了一下如何在终端中获取正在运行程序的PID,并且我发现grep app_name是一个常见的拼图。同样适用于ps -ax... 所以我遵循了自己的假设,删除了调用程序再次运行的变量,并将该程序的名称简单地插入到字符串的grep部分中,替换变量。然后,它奏效了! - DasKraut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接