使用“bash 脚本”将命令发送到“应用程序的外壳”[重复]
Posted
技术标签:
【中文标题】使用“bash 脚本”将命令发送到“应用程序的外壳”[重复]【英文标题】:Sending commands to "application's shell" using "bash script" [duplicate] 【发布时间】:2021-07-23 09:34:46 【问题描述】:我有一个程序JLinkExe
在执行时打开它自己的提示。所以我通常是这样运行的:
JLinkExe
然后在出现的提示符下键入命令:
J-Link>
有许多应用程序都有自己的提示符,我对一种通用方法很感兴趣,该方法使我能够向任何有自己提示符的应用程序发送命令。
我已经尝试了两种方法。他们都尝试按以下顺序发送命令:
connect
输入
输入
输入
输入
erase
loadbin program.bin , 0x0
r
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
我在互联网上找到了这些方法,但我不明白为什么它们会失败。尤其是过去的第一个工作......
谁能提出更好/有效/普遍适用的方法?
【问题讨论】:
【参考方案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>
出现然后通过连接发送命令。
如果它不起作用,请通知我。周末后我会尽力帮助你:-)
编辑:
A:为什么你把所有的东西都包在expect 2>&1 <<-EOF
和EOF
中?你可以在shebang 中添加expect
,但我经常将它用作我的Bash 脚本的一部分。我对 Bash 的了解更好。
B:为什么使用 -EOF 而不是 EOF?这是因为 <<-EOF
在您想要结束 here-doc 时允许使用前导制表符。例如,您可以在函数中缩进它。
C:你为什么将 stderr 重定向到 stdout (2>&1)?在你的情况下,我应该删除它。我从关于期望的其他答案之一中获取了代码,并根据您的需求对其进行了定制。
D:catch wait result
和 exit [lindex \$result 3]
在我们捕获到 eof 后会做什么?很好的问题,我必须自己查一下这个问题:
lindex
接受\$result
中的第四个参数并退出 here-doc(0 是 arg 1)。
\$result
由catch wait result
设置。
Catch
获取wait
的输出并将其放入result
。
Wait
返回四个整数:
First:正在等待的进程的 pid。
第二个:生成 ID。
第三:-1 表示错误,0 否则。
Forth:操作系统设置的程序退出状态。
来源:
https://linux.die.net/man/1/expect
https://www.tcl.tk/man/tcl/TclCmd/catch.html
https://www.tcl.tk/man/tcl/TclCmd/lindex.html
请注意,您必须在 here-doc 中转义 $
,否则 Bash 会尝试处理它。因此\$result
。
E:为什么要使用 exit $ 退出?Bash 退出脚本时使用最后一个已知的错误代码。尽管您可以隐式保留它,但我还是喜欢添加它。它使脚本对初学者更具可读性。
【讨论】:
我有几个问题。您能否在问题中详细说明以下内容。 答: 你为什么把所有东西都包在expect 2>&1 <<-EOF
和EOF
中? B: 为什么是-EOF
而不是EOF
? C: 你为什么将 stderr 重定向到 stdout (2>&1
)? D: 在我们捕捉到eof
之后,catch wait result
和exit [lindex \$result 3]
会做什么? E:你为什么退出exit $?
?以上是关于使用“bash 脚本”将命令发送到“应用程序的外壳”[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 mail 或 mailx 命令从 bash 脚本以 HTML 格式发送电子邮件(Centos/Redhat)