Answers:
有专门针对这种情况创建的命令: yes
$ yes | ./script
这是将的输出连接yes
到的输入./script
。因此,当./script
要求用户输入时,它将获取的输出yes
。的输出yes
是无休止的y
后跟换行符的流。基本上就像用户输入y
的每个问题一样./script
。
如果您要说不(n
)而不是(y
),可以这样进行:
$ yes n | ./script
请注意,某些工具可以选择始终yes
作为答案。例如,请参见此处:在“ apt-get upgrade”中跳过是/否提示
其他输入方法:
如果您确切知道y
您的脚本期望多少,则可以执行以下操作:
$ printf 'y\ny\ny\n' | ./script
换行符(\n
)是Enter键。
使用printf
代替yes
您可以对输入进行更细粒度的控制:
$ printf 'yes\nno\nmaybe\n' | ./script
请注意,在极少数情况下,该命令不需要用户在字符后按Enter。在这种情况下,请省略换行符:
$ printf 'yyy' | ./script
为了完整起见,您还可以使用here文档:
$ ./script << EOF
y
y
y
EOF
或者,如果您的外壳支持它,则为here字符串:
$ ./script <<< "y
y
y
"
或者,您可以创建一个文件,每行一个输入:
$ ./script < inputfile
如果命令足够复杂,并且以上方法不再足够,则可以使用Expect。
这是一个超级简单的Expect脚本的示例:
spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof
技术nitpick:
您在问题中给出的假设命令调用不起作用:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
这是因为Shell语法允许在命令行中的任何位置进行重定向操作符。就外壳而言,您的假设命令行与此行相同:
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
这意味着./script
将使用参数调用,'yyyyyyyyyyyyyy'
并且stdin将从名为的文件中获取输入echo
。由于文件不存在,bash抱怨。
cannot enable tty mode on non tty input
。您知道解决方法吗?
printf
使用run
需要自动执行安装过程的文件进行欺骗时,所有发生的事情是我收到一条错误消息Warning: Tried to connect to session manager, None of the authentication protocols specified are supported
,并且该脚本在新的终端中打开,并要求我像往常一样手动输入输入。顺便说一下,这在Debian上正在发生。有什么建议么?
某些事物(apt-get
例如)接受特殊标志以在静默模式下运行(并接受默认值)。在apt-get
这种情况下,您只需向其传递一个-y
标志即可。不过,这完全取决于您的脚本。
如果您需要更复杂的东西,可以将脚本包装在Expect脚本中。Expect允许您读取输出并发送输入,因此您可以执行其他脚本不允许的非常复杂的事情。这是其Wikipedia页面中的示例之一:
# Assume $remote_server, $my_user_id, $my_password, and $my_command were read in earlier
# in the script.
# Open a telnet session to a remote server, and wait for a username prompt.
spawn telnet $remote_server
expect "username:"
# Send the username, and then wait for a password prompt.
send "$my_user_id\r"
expect "password:"
# Send the password, and then wait for a shell prompt.
send "$my_password\r"
expect "%"
# Send the prebuilt command, and then wait for another shell prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof
.sh
shell脚本一起使用,对吧?还是有办法?
您可以使用cat
,从文本文件中通过提供用户输入的脚本,通过以下方式通过管道将其输入到脚本中bash
:
cat input.txt | bash your_script.sh
只需将所需的用户输入内容输入到input.txt文件中,即可获取所需的答案-y,n,数字,字符串等。
-f
选项对于某些命令会很好地起作用。