【问题标题】:Applescript - How to run a single bash command from terminal and wait for response before continue?Applescript - 如何从终端运行单个 bash 命令并在继续之前等待响应?
【发布时间】:2015-11-28 02:45:43
【问题描述】:

我有一个modelinfo.sh 文件,如果我在终端中运行它,它会将结果回显/保存到 TXT 文件中。

要从终端执行此文件,我使用命令:

./modelinfo.sh -s C8QH74G6DP11

使用此命令,它会保存给定序列号的结果:C8QH74G6DP11

我需要获取 5000 部连续剧的报告,所以我认为 AppleScript 可能会帮助我?

我已经用 AppleScript 编写了这段代码:

tell application "Terminal"
    do script ("./modelinfo.sh -s C8TJ14JWDP11") in window 1
    do script ("./modelinfo.sh -s C8QH74G6DP12") in window 1
    do script ("./modelinfo.sh -s C8QKGFWSDP13") in window 1
    do script ("./modelinfo.sh -s C8QKFR5FDP14") in window 1
end tell

使用上面的代码,我的 IP 被阻止,我只得到第一个序列号的报告。

我也试过了:

on delay duration
    set endTime to (current date) + duration
    repeat while (current date) is less than endTime
        tell AppleScript to delay duration
    end repeat
end delay
tell application "Terminal"
    do script ("./modelinfo.sh -s C8TJ14JWDP11") in window 1
    delay 20
    do script ("./modelinfo.sh -s C8QH74G6DP12") in window 1
    delay 20
    do script ("./modelinfo.sh -s C8QKGFWSDP13") in window 1
    delay 20
    do script ("./modelinfo.sh -s C8QKFR5FDP14") in window 1
end tell

但是这段代码也无济于事..

我最后一次尝试:

tell application "Terminal"
    do script ("./modelinfo.sh -s C8TJ14JWDP11") in window 1
end tell

最后一个脚本我可以根据需要运行多次,而且我总是可以得到报告而不会阻止我的 IP。

即使我的 IP 被阻止,Applescript 似乎同时运行所有 4 个连续剧? 因为我可以多次运行单次检查而不会被阻止。

谁能帮我指出正确的方向?

Applescript 可以做到这一点吗? 或者我可以创建一个新的 bash 文件来运行我的所有 5000 个命令 1 到 1?

谢谢

【问题讨论】:

  • 为什么不将这些值放入一个数组中,而不是一遍又一遍地单独调用它们?
  • 我是 Bash/Applescript 的新手。只在 PHP 中使用过数组。你能举例说明你的意思吗?谢谢
  • 嗯,我不知道你为什么首先使用 Applescript;看来你所做的一切都是调用一个 shell 脚本——为什么不直接删掉 Applescript?
  • @l'L'l 是的,我需要做的就是用不同的序列号调用一个 shell 脚本 5000 次。它们应该被一个一个地调用。我认为 Applescript 是一种简单的方法。请指出我正确的方向。我该用什么?
  • 你不需要调用一个shell脚本5000次!对于 shell 脚本来说,无论它有多少值,循环遍历数组都会更有意义。发布您当前正在调用的 shell 脚本,它使用的值是如何存储的?

标签: bash terminal applescript


【解决方案1】:

嗯,这是 Applescript 中使用您正在尝试的方法的常用方法。

property serialList: {"C8TJ14JWDP11", "C8QH74G6DP12", "C8QKGFWSDP13", "C8QKFR5FDP14"}

tell application "Terminal"
repeat with aSerial in serialList
    do script ("./modelinfo.sh -s " & aSerial) in window 1
    delay 20
end

这应该可行。但是,终端窗口的状态需要完成该进程并准备好下一次调用才能使其工作,因此延迟 20 可能过于简单。将上面的代码放在 try 块中,看看有没有错误。

try
-- above code goes here
on error err
display dialog err
end try

然而,另一种方法是直接在 Applescript 中包含 shell 命令,而无需通过终端应用程序,使用

do shell script

您必须发布您的 modelinfo.sh 文件的内容才能了解这种可能性。

【讨论】:

    【解决方案2】:

    更新答案

    如果您想计算行数并指示进度,请将下面的代码替换为:

    #!/bin/bash
    declare -i total
    total=$(wc -l <sn.txt)     # count the lines in sn.txt
    i=1
    while read sn; do
       echo "Fetching $sn ($i of $total)"
       ./modelinfo.sh -s "$sn"
       ((i++))
    done < sn.txt
    

    原答案

    不知道为什么有人会为此使用 Applescript - 这显然是一个从终端运行的简单 bash 脚本。

    假设您的序列号保存在一个名为 sn.txt 的文件中,如下所示:

    C8QH74G6DP11
    C8TJ14JWDP11
    C8QH74G6DP12
    C8QKGFWSDP13
    

    然后,您将以下内容保存在您的 HOME 目录中名为 fetch 的文件中。它一次读取一个序列号并获取它们。

    #!/bin/bash
    while read sn; do
       echo Fetching $sn...
       ./modelinfo.sh -s "$sn"
    done < sn.txt
    

    然后您将进入终端并键入以下内容以使其可执行:

    chmod +x fetch
    

    然后你可以通过输入来运行它

    ./fetch
    

    您可以通过按住Command 并点击空格键然后输入Ter 来启动终端,Spotlight 会猜测您的意思是终端,然后您只需点击Enter 即可实际启动它。

    【讨论】:

    • 太棒了.. 这是一个非常好的方法来做我想做的事!你能分享一下如何计算和回显sn.txt中的SN总数吗?还回显现在正在处理哪个#NR,还剩下多少?感谢一百万
    • 出色的解决方案.. 它的工作方式完全符合我的要求。感谢您的帮助,这对我有很大帮助!我在路上:D
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多