动态地为shell脚本中的调用脚本提供默认输入

时间:2014-11-19 07:32:20

标签: linux bash shell unix

我有一个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请求?

1 个答案:

答案 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。换行符与enterreturn键生成的内容相同。

使用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