Автоматически вводить ввод в командной строке

76

Я запускаю скрипт, который запрашивает ввод «y» для каждой операции. Я ищу решение, например, $ ./script < echo 'yyyyyyyyyyyyyy' , чтобы передать все мои входы за один раз.

    
задан NewMrd 29.08.2013 в 14:05
источник

6 ответов

150

Для этого случая создана команда, созданная специально для этого случая: yes

$ yes | ./script

Что yes делает, он многократно печатает y , за которым следует новая строка в stdout. Если вы подключите вывод yes к другой команде, используя канал (вертикальная полоса), то y , за которым следует новая строка, будет поступать на вход другой команды.

Если вы хотите сказать нет ( n ) вместо yes ( y ), вы можете сделать это следующим образом:

$ yes n | ./script

Другие способы ввода ввода:

Если вы точно знаете, сколько y ожидает ваш сценарий, вы можете сделать это следующим образом:

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

Новые строки ( \n ) - это клавиши ввода.

Используя printf вместо yes , у вас есть более мелкозернистый контроль ввода:

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

Обратите внимание, что в некоторых редких случаях команда не требует, чтобы пользователь нажимал enter после символа. в этом случае оставьте новые строки:

$ printf 'yyy' | ./script

Для полноты вы также можете использовать здесь документ :

$ ./script << EOF
y
y
y
EOF

Или если ваша оболочка поддерживает здесь строку :

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

Или вы можете создать файл с одним вводом на строку:

$ ./script < inputfile

Если команда достаточно сложная, и вышеописанных методов больше нет, вы можете использовать ожидать .

Техническая нить:

Гипотетический вызов команды, который вы указали в своем вопросе, не работает:

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

Это связано с тем, что грамматика оболочки позволяет оператору перенаправления в любом месте командной строки. Что касается оболочки, то ваша гипотетическая командная строка совпадает с этой строкой:

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

Это означает, что ./script будет вызываться с аргументом 'yyyyyyyyyyyyyy' , а stdin получит входной файл из файла с именем echo . И bash жалуется, поскольку файл не существует.

    
ответ дан lesmana 29.08.2013 в 14:08
источник
6

Некоторые вещи (например, apt-get ) принимают специальные флаги для запуска в бесшумном режиме (и принимают значения по умолчанию). В случае apt-get вы просто передаете ему флаг -y . Это полностью зависит от вашего скрипта.

Если вам нужны более сложные вещи, вы можете обернуть свой скрипт в сценарий ожидания. ожидать позволяет читать выходные данные и отправлять их, чтобы вы могли делать довольно сложные вещи, которые другие сценарии не позволяли. Вот один из примеров со страницы Википедии :

# 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
    
ответ дан Oli 29.08.2013 в 14:12
5

В сценарии оболочки вы также можете использовать следующий трюк икру, ожидать и отправлять

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

Однако в приведенном выше примере вам нужно будет указать фразу, которую вы ожидаете получить, пока вы выполняете скрипт для получения дополнительных примеров, перейдите по следующей ссылке

Ожидайте в Bash

    
ответ дан Tarun 29.08.2013 в 14:35
4

Используйте команду 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'.
    
ответ дан Peter W. Osel 11.04.2014 в 16:40
1

Хорошо, это может быть не очень изящное решение, но если вы напишете свои параметры в отдельном файле, а затем передадите его как вход в скрипт, это тоже сработает. Поэтому, если вы создаете новый файл со всеми вашими параметрами (назовите этот файл как «options.in»), вы можете легко запустить свой скрипт с помощью ./script.sh < options.in и отредактировать / создать различные файлы параметров.     

ответ дан Sidhha 29.08.2013 в 17:50
0

Я писал скрипт nfsutil с диалоговыми меню, и это также необходимо было выполнить автоматически. Я сделал это, и это сработало как шарм.

# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog
    
ответ дан Benjamin G. West 03.08.2017 в 18:05