我正在运行一个脚本,它要求在每个操作上输入“y”,我正在寻找一种解决方案,比如$ ./script < echo 'yyyyyyyyyyyyyy'
一次性传递所有输入。
答案1
有一个专门针对这种情况创建的命令: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
)是回车键。
使用printf
而不是yes
你可以对输入进行更细粒度的控制:
$ printf 'yes\nno\nmaybe\n' | ./script
请注意,在某些罕见情况下,命令不需要用户在字符后按回车键。在这种情况下,请省略换行符:
$ printf 'yyy' | ./script
为了完整起见,您还可以使用这里的文件:
$ ./script << EOF
y
y
y
EOF
(实际的换行符将成为输入的一部分./script
)
或者如果你的 shell 支持它这里是字符串:
$ ./script <<< "y
y
y
"
或者您可以创建一个每行一个输入的文件:
$ ./script < inputfile
如果命令足够复杂,上述方法不再适用,那么您可以使用预计。
这是一个非常简单的期望脚本的例子:
spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof
技术挑剔:
您在问题中给出的假设命令调用不起作用:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
这是因为 shell 语法允许在命令行的任何位置使用重定向运算符。就 shell 而言,您的假设命令行与此行相同:
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
这意味着./script
将使用参数调用'yyyyyyyyyyyyyy'
,并且 stdin 将从名为 的文件获取输入echo
。并且 bash 会抱怨,因为该文件不存在。
答案2
使用命令yes
:
yes | script
手册页摘录:
NAME
yes - output a string repeatedly until killed
SYNOPSIS
yes [STRING]...
yes OPTION
DESCRIPTION
Repeatedly output a line with all specified STRING(s), or 'y'.
答案3
有些东西(apt-get
例如)接受特殊标志以在静默模式下运行(并接受默认值)。在apt-get
这种情况下,您只需向其传递一个-y
标志。但这完全取决于您的脚本。
如果你需要更复杂的东西,你可以将脚本包装在 expect 脚本中。expect 允许你读取输出并发送输入,这样你就可以做其他脚本不允许的相当复杂的事情。下面是维基百科页面中的一个例子:
# 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
答案4
您可以使用将用户输入cat
从文本文件提供给您的脚本,然后通过管道传输到您的脚本,如下bash
所示:
cat input.txt | bash your_script.sh
只需将您想要的用户输入放入您的 input.txt 文件中,无论您想要什么答案 - y,n,数字,字符串等。