我有一个shell脚本main_script.sh,它将在术语中调用其他3个脚本(a1.sh,a2.sh,a3.sh)。 现在执行a1.sh/a2.sh/a3.sh我需要用Y / N回答一些详细信息。
我知道每个a1.sh/a2.sh/a3.sh都需要2个Y / N.
如何实现main_script.sh,所以我不必在执行时回答Y / N请求?
答案 0 :(得分:1)
这取决于脚本的编写方式。您提到每个脚本需要两个Y
。我假设每个Y
都需要后跟一个回车键(换行符)。在这种情况下,它可以像使用main_script.sh
:
#!/bin/bash
echo $'Y\nY\n' | bash a1.sh
echo $'Y\nY\n' | bash a2.sh
echo $'Y\nY\n' | bash a3.sh
上面,echo
命令向每个脚本发送两个Y
和换行符。您可以根据需要进行调整。
有些脚本会坚持交互式输入来自终端,而不是stdin。傻瓜这样的剧本更难,但并非不可能。对于他们,请使用expect
/pexpect
。
让我们更详细地了解其中一个命令:
echo $'Y\nY\n' | bash a1.sh
|
是管道符号。它将标准从echo
命令连接到a1.sh
命令的标准输入。如果a1.sh
符合要求,我们可以预先回答a1.sh
提出的任何问题。
在这种情况下,echo
命令的输出为$'Y\nY\n'
。这是一个bash shell语法,意思是Y
,后跟换行符,由\n
表示,后跟Y
,后跟换行符\n
。换行符与enter
或return
键生成的内容相同。
expect
如果您的脚本不接受stdin上的输入,那么expect
可用于自动执行与脚本的交互。举个例子:
#!/bin/sh
expect <<EOF1
spawn a1.sh
expect "?"
send "Y\r"
expect "?"
send "Y\r"
sleep 1
EOF1
expect <<EOF2
spawn a2.sh
expect "?"
send "Y\r"
expect "?"
send "Y\r"
sleep 1
EOF2