我正在运行一个脚本,要求在每个操作上输入“ y”,我正在寻找一种解决方案,例如$ ./script < echo 'yyyyyyyyyyyyyy',可以一次传递所有输入。

评论

有时-f选项可以与某些命令配合使用。

#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)是Enter键。

使用printf代替在yes中,您可以更精细地控制输入:

$ printf 'yes\nno\nmaybe\n' | ./script


请注意,在极少数情况下,该命令不需要用户在字符后按Enter。在这种情况下,请不要使用换行符:

$ printf 'yyy' | ./script


为了完整起见,您还可以使用以下文档:

$ ./script << EOF
y
y
y
EOF


或者如果您的外壳支持此字符串:

$ ./script <<< "y
y
y
"


或者您可以创建每行一个输入的文件:

$ ./script < inputfile


如果命令足够复杂并且上面的方法不再满足要求,那么您可以使用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语法允许在命令行中的任何位置进行重定向操作符。就shell而言,您的假设命令行与此行相同:

$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory


这意味着./script将使用参数'yyyyyyyyyyyyyy'调用,并且stdin将得到从名为echo的文件输入。由于文件不存在,bash抱怨。

评论


我在非tty输入上得到一个无法启用tty模式的信息。您知道解决方法吗?

–bmpasini
16-4-22在19:33



当我尝试使用需要自动执行安装过程的运行文件来执行printf技巧时,所有发生的是我收到一条错误消息,警告:试图连接到会话管理器,不支持指定的身份验证协议,并且脚本会在新终端中打开,并要求我像往常一样手动输入输入。顺便说一下,这在Debian上正在发生。有什么建议?

–DaveTheMinion
17年7月11日在18:45

需要更多细节。太大而无法发表评论。请询问所有细节的新问题。您可以在此处放置一个链接。

– Lesmana
17年7月11日在19:55

在centos上,“ vagrant destroy”无效

–提请
17年4月4日在18:06

邪恶容易!适用于Google Cloud Beta SQL数据导入!非常感激!

– G_Style
18 Mar 30 '18 at 18:12

#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允许您读取输出并发送输入,因此您可以执行其他脚本不允许的非常复杂的事情。以下是其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脚本一起使用,对吗?还是有办法?

–沙燕
19年8月29日15:50

#4 楼

在shell脚本中,您还可以使用以下派生技巧,expect and send

spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"


但是,在上述场景中,您将必须给出期望的短语在执行脚本以获取更多示例时获得的帮助,请转到以下链接

在Bash中期待

#5 楼

好的,这可能不是一个很好的解决方案,但是如果您将选项写在一个单独的文件中,然后将其作为脚本的输入传递,那么它也可以正常工作。因此,如果您创建一个包含所有选项的新文件(将此文件称为“ options.in”),则可以轻松地使用./script.sh < options.in运行脚本,并根据需要编辑/创建其他选项文件。

评论


我应该如何编写options.in文件?你能给个例子吗?

–沙燕
19年8月29日在17:08

#6 楼

我当时正在用Dialog编写bash脚本,并且还需要自动执行此操作。我做到了,它就像一个魅力。

# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog


#7 楼

您可以通过文本文件使用cat提供用户输入到脚本中,然后使用bash通过管道将其输入到脚本中,如下所示: input.txt文件,无论您想要什么答案-y,n,数字,字符串等。

评论


又名askubuntu.com/a/338955/158442

–muru
18年7月5日在9:51

@muru对我来说,您提到的解决方案不起作用,所以我必须发明自己的解决方案。

– WebComer
18年7月5日在9:53



不太可能。你们两个描述的是同一件事。

–muru
18年7月5日在9:55

@muru从文件中提供答案的类似想法(可以通过几种方法完成)不是同一回事,而且它以完全不同的方式实现。您应该能够看到它。如果您指出的解决方案对我有用,那么我今天不会花时间重新发明轮子。您可以使用任何适合您的工作。

– WebComer
18年7月5日在10:35



@muru我相信两者之间是有区别的,其中一些在答案中描述,请参见这里askubuntu.com/questions/172982/…。例如,对我来说,将输出重定向到文件的代码似乎是从左到右的自然流动,因此更加清晰。毕竟,对像您这样行之有效的解决方案进行低估并不会刺激人们在这里分享他们的解决方案。我相信这足以消除不满。

– WebComer
18年7月5日在16:38