以非交互方式将参数传递给交互式程序

sid*_*rma 101 bash interactive non-interactive

我有一个bash脚本,它使用该read命令以交互方式读取命令的参数,例如是/否选项.有没有办法在非交互式脚本中调用此脚本将默认选项值作为参数传递?

这不仅仅是我必须传递给交互式脚本的一个选项.

gle*_*man 139

很多种方法

输入您的输入

echo "yes
no
maybe" | your_program
Run Code Online (Sandbox Code Playgroud)

从文件重定向

your_program < answers.txt
Run Code Online (Sandbox Code Playgroud)

使用这里的文件(这可以很容易阅读)

your_program << ANSWERS
yes
no
maybe
ANSWERS
Run Code Online (Sandbox Code Playgroud)

使用here字符串

your_program <<< $'yes\nno\nmaybe\n'
Run Code Online (Sandbox Code Playgroud)

  • 值得指出的是,只有在程序读取标准输入时,这才有效.有些程序会以交互方式阅读密码,即使标准输入是管道也是如此.对于密码,出于安全原因这是有意义的; 虽然一些交互式程序设计简单. (3认同)
  • 像Expect这样的程序是在伪tty下运行客户端,它在客户端看起来就像有一个用户在另一端有一个终端和一个键盘.你不能用常规管道做到这一点. (2认同)

Dan*_*xan 39

对于更复杂的任务,有expect(http://en.wikipedia.org/wiki/Expect).它基本上模拟用户,您可以编写脚本如何对特定程序输出和相关内容做出反应.

这也适用于ssh禁止管道密码的情况.

  • ...虽然SSH案例中的正确解决方案是切换到公钥认证. (6认同)

Gur*_*uru 13

您可以将数据放入文件中并像这样重定向:

$ cat file.sh
#!/bin/bash

read x
read y
echo $x
echo $y
Run Code Online (Sandbox Code Playgroud)

脚本数据:

$ cat data.txt
2
3
Run Code Online (Sandbox Code Playgroud)

执行脚本:

$ file.sh < data.txt
2
3
Run Code Online (Sandbox Code Playgroud)


小智 7

只想添加一个方法.在其他地方找到它,非常简单.假设我想在命令行中为命令"execute_command"的所有提示传递yes,那么我只是管道是的.

yes | execute_command
Run Code Online (Sandbox Code Playgroud)

这将使用yes作为所有是/否提示的答案.

  • 这也可以自定义为不仅传递“y”,还可以传递任何您喜欢的字符串。例如,要传递“n”,只需编写“yes n |”即可。执行命令` (3认同)

spa*_*han 6

您还可以使用 printf 将输入通过管道传输到您的脚本。

var=val
printf "yes\nno\nmaybe\n$var\n" | ./your_script.sh
Run Code Online (Sandbox Code Playgroud)