Automatically enter input in command line
Solution 1
There is a command created specifically for that case: yes
$ yes | ./script
What this does is connect the output of yes
to the input of ./script
. So when ./script
asks for user input it will instead get the output of yes
. The output of yes
is an endless stream of y
followed by a newline. So basically as if the user is entering y
for every question of ./script
.
If you want to say no (n
) instead of yes (y
) you can do it like this:
$ yes n | ./script
Note that some tools have an option to always asume yes
as answer. See here for example: Bypass the yes/no prompt in 'apt-get upgrade'
Other methods to enter input:
If you know exactly how many y
your script is expecting you can do it like this:
$ printf 'y\ny\ny\n' | ./script
The newlines (\n
) are the enter keys.
Using printf
instead of yes
you have more fine grained control of input:
$ printf 'yes\nno\nmaybe\n' | ./script
Note that in some rare cases the command does not require the user to press enter after the character. in that case leave the newlines out:
$ printf 'yyy' | ./script
For sake of completeness you can also use a here document:
$ ./script << EOF
y
y
y
EOF
Or if your shell supports it a here string:
$ ./script <<< "y
y
y
"
Or you can create a file with one input per line:
$ ./script < inputfile
If the command is sufficiently complex and the methods above no longer suffice then you can use expect.
Here is an example of a super simple expect script:
spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof
Technical nitpick:
The hypothetical command invocation you gave in your question does not work:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
This is because the shell grammar allows a redirect operator anywhere in the command line. As far as the shell is concerned your hypothetical command line is the same as this line:
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
That means ./script
will be called with the argument 'yyyyyyyyyyyyyy'
and the stdin will get input from a file named echo
. And bash complains since the file does not exists.
Solution 2
Use the command yes
:
yes | script
Excerpt from the man page:
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'.
Solution 3
Some things (apt-get
for example) accept special flags to run in silent mode (and accept defaults). In apt-get
's case, you just pass it a -y
flag. This does completely depend on your script though.
If you need more complicated things, you can wrap your script in an expect script. expect allows you to read output and send input so you can do pretty complicated things that other scripting wouldn't allow. Here's 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
Solution 4
In the shell script you can also use the following trick of spawn, expect and send
spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
However in the above scenerio you will have to give the phrase you are expecting to get while you execute the script for more examples go to the following link
Solution 5
You can supply user input to your script with cat
, from a text file, piped to your script with bash
like this:
cat input.txt | bash your_script.sh
Just put your desired user input into your input.txt file, whatever answers you want - y, n, digits, strings, etc.
Related videos on Youtube
Comments
-
NewMrd over 1 year
I'm running a script that it requests entering 'y' on each operation, I am looking for a solution like
$ ./script < echo 'yyyyyyyyyyyyyy'
to pass all my inputs in one time.-
iammilind almost 8 yearsSometimes
-f
option works well with certain commands.
-
-
bmpasini about 8 yearsI get a
cannot enable tty mode on non tty input
. Would you know a workaround for that? -
DaveTheMinion almost 7 yearsWhen I try the
printf
trick with arun
file that I need to automate the installation process of, all that happens is I get an error message sayingWarning: Tried to connect to session manager, None of the authentication protocols specified are supported
, and the script opens in a new terminal and asks me to enter my input manually as usual. This is happening on Debian by the way. Any suggestions? -
Lesmana almost 7 yearsneed more details. too big for comments. please ask a new question with all the details. you can put a link here.
-
Drew over 6 yearsnothing works with 'vagrant destroy' on centos
-
G_Style about 6 yearsWicked easy! Works on the Google Cloud Beta SQL data imports! Much appreciated!
-
Björn over 5 yearsI just learned that actually /bin/yes can send any argument given, like
yes
no
ormaybe
not only single characters. -
a.t. about 5 yearsDoes the command
$ printf 'yyy' | ./script
send 3yes
three times, or is it a syntax to send one yes? I assume it is the first option since it is in context of sending theyes
command multiple times, but I have not found a way to test it. -
Shayan over 4 years@lesmana Is there any way to edit the shell file to have the script itself enter
yes
orno
for us? -
Shayan over 4 yearsThis can't be used it with a
.sh
shell script, right? Or is there a way? -
Shayan over 4 yearsHow should I write the
options.in
file? Can you give an example? -
Shayan over 4 years@WebComer How should I write the
input.txt
file? Can you give an example? -
vahotm about 2 yearsHi @Lesmana,
melos
command gives meStdinException: Error getting terminal echo mode, OS Error: Inappropriate ioctl for device, errno = 25
when I pass output ofyes
to it. Is it possible to fix this? Command:$ yes 33 | melos run analyze
-
Lesmana about 2 yearsto big for comment. please post is as a new question. feel free to drop link to new question here.
-
Admin about 2 years
printf y\n
without quotation marks will printyn
whereas single and double quoation marks as inprintf 'y\n'
work and print a new line.