linux - 从 shell 脚本动态地为调用脚本提供默认输入

标签 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 请求?

最佳答案

这取决于脚本的编写方式。您提到每个脚本需要两个 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。换行符与 enterreturn 键生成的相同。

使用期望

如果您的脚本不接受 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/

相关文章:

perl - 我如何在 Perl 5.8.8 中使用 'say'?

bash - Rundeck 跨作业步骤共享变量

git - 通过终端在 Github/Gitlab 上创建一个新项目

c++ - 从 Qt4 运行 Linux 命令

c++ - 如何打印linux上进程拥有的所有线程的线程ID

linux - SonarQube 不延长超时

c - getc 函数产生段错误

c++ - make_heap() 编译问题

linux - 无法制定与 sed 一起使用的正则表达式来提取列值

macos - 从外部(父)脚本控制寻呼机(如 less 程序)