我有一个 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 请求?
最佳答案
这取决于脚本的编写方式。您提到每个脚本需要两个 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
和换行符。您可以根据需要进行调整。
一些脚本会坚持交互输入来自终端,而不是标准输入。这样的脚本更难被愚弄,但并非不可能。对于他们,使用 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
键生成的相同。
使用期望
如果您的脚本不接受 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
关于linux - 从 shell 脚本动态地为调用脚本提供默认输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27011343/