当前位置: 首页>>技术问答>>正文


在命令行中自动输入输入

, ,

问题描述

我正在运行一个脚本,它要求在每个操作中输入’y’,我正在寻找类似$ ./script < echo 'yyyyyyyyyyyyyy'的解决方案来一次性传递所有输入。

最佳解决思路

有一个专门为这种情况创建的命令:yes

$ yes | ./script

yes所做的是重复打印y,然后换行到标准输出。如果使用管道(垂直条)将yes的输出连接到另一个命令,则y后跟换行符将转到另一个命令的输入。

如果你想拒绝(n)而不是(y),你可以这样做:

$ yes n | ./script

其他输入方法:

如果你确切地知道你的脚本需要多少y,你可以这样做:

$ printf 'y\ny\ny\n' | ./script

换行符(\n)是输入键。

使用printf而不是yes可以更精细地控制输入:

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

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

$ printf 'yyy' | ./script

为了完整起见,您还可以使用here document

$ ./script << EOF
y
y
y
EOF

或者如果你的shell支持它一个here string

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

或者你可以创建一个文件,每行一个输入:

$ ./script < inputfile

如果命令足够复杂并且上面的方法不再满足,则可以使用expect


技术挑选:

您在问题中给出的假设命令调用不起作用:

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

这是因为shell语法允许在命令行中的任何位置使用重定向运算符。就shell而言,假设的命令行与此行相同:

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

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

次佳解决思路

有些东西(例如apt-get)接受特殊标志以静默模式运行(并接受默认值)。在apt-get的情况下,您只需将它传递给-y标志。这完全取决于你的脚本。

如果您需要更复杂的事情,可以将脚本包装在期望脚本中。 expect允许您读取输出并发送输入,以便您可以执行其他脚本不允许的非常复杂的事情。这里是one of the examples from its Wikipedia page

# 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

第三种解决思路

在shell脚本中,您还可以使用以下派生,期望和发送技巧

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

然而,在上面的场景中,你将不得不提供你期望得到的短语,而你执行脚本以获取更多示例,请转到以下链接

Expect within Bash

第四种思路

使用命令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'.

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/878.html,未经允许,请勿转载。