【问题标题】:Sending commands to "application's shell" using "bash script" [duplicate]使用“bash 脚本”将命令发送到“应用程序的外壳”[重复]
【发布时间】:2021-07-23 09:34:46
【问题描述】:

我有一个程序JLinkExe 在执行时打开它自己的提示。所以我通常是这样运行的:

JLinkExe

然后在出现的提示符下键入命令:

J-Link>

有许多应用程序都有自己的提示符,我对一种通用方法很感兴趣,该方法使我能够向任何有自己提示符的应用程序发送命令。


我已经尝试了两种方法。他们都尝试按以下顺序发送命令:

  1. connect
  2. 输入
  3. 输入
  4. 输入
  5. 输入
  6. erase
  7. loadbin program.bin , 0x0
  8. r
  9. q

但两者都失败了。这是第一种方法:

   { echo 'connect';
     echo '';
     echo '';
     echo '';
     echo '';
     echo 'erase';
     echo 'loadbin program.bin , 0x0';
     echo 'r';
     echo 'q'; } | JLinkExe

还有第二种方法(source):

JLinkExe <<EOF
connect




erase
loadbin program.bin , 0x0
r
q
EOF

我在互联网上找到了这些方法,但我不明白为什么它们会失败。尤其是过去的第一个工作......

谁能提出更好/有效/普遍适用的方法?

【问题讨论】:

    标签: bash


    【解决方案1】:

    我认为这可能是因为 here-docs 不等待输出。不幸的是,我换了公司,因此无法在下面测试我的代码。

    #! /bin/bash
    expect <<-EOF
        set timeout -1
        spawn JLinkExe
        expect "J-Link> " { send "connect\r" }
        expect "J-Link> " { send "\r" }
        expect "J-Link> " { send "\r" }
        expect "J-Link> " { send "\r" }
        expect "J-Link> " { send "\r" }
        expect "J-Link> " { send "erase\r" }
        expect "J-Link> " { send "loadbin program.bin , 0x0\r" }
        expect "J-Link> " { send "r\r" }
        expect "J-Link> " { send "q\r" }
        expect eof
        catch wait result
        exit [lindex \$result 3]
    EOF
    exit $?
    

    除非等到J-Link&gt; 出现然后通过连接发送命令。

    如果它不起作用,请通知我。周末后我会尽力帮助你:-)

    编辑:
    A:为什么你把所有的东西都包在expect 2&gt;&amp;1 &lt;&lt;-EOFEOF 中?
    你可以在shebang 中添加expect,但我经常将它用作我的Bash 脚本的一部分。我对 Bash 的了解更好。

    B:为什么使用 -EOF 而不是 EOF?
    这是因为 &lt;&lt;-EOF 在您想要结束 here-doc 时允许使用前导制表符。例如,您可以在函数中缩进它。

    C:你为什么将 stderr 重定向到 stdout (2>&1)?
    在你的情况下,我应该删除它。我从关于期望的其他答案之一中获取了代码,并根据您的需求对其进行了定制。

    D:catch wait resultexit [lindex \$result 3] 在我们捕获到 eof 后会做什么?
    很好的问题,我必须自己查一下这个问题:

    请注意,您必须在 here-doc 中转义 $,否则 Bash 会尝试处理它。因此\$result

    E:为什么要使用 exit $ 退出?
    Bash 退出脚本时使用最后一个已知的错误代码。尽管您可以隐式保留它,但我还是喜欢添加它。它使脚本对初学者更具可读性。

    【讨论】:

    • 我有几个问题。您能否在问题中详细说明以下内容。 答: 你为什么把所有东西都包在expect 2&gt;&amp;1 &lt;&lt;-EOFEOF 中? B: 为什么是-EOF 而不是EOFC: 你为什么将 stderr 重定向到 stdout (2&gt;&amp;1)? D: 在我们捕捉到eof 之后,catch wait resultexit [lindex \$result 3] 会做什么? E:你为什么退出exit $?
    猜你喜欢
    • 2015-12-04
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2020-11-29
    • 2012-01-15
    • 2020-08-02
    相关资源
    最近更新 更多