Я запускаю скрипт, который запрашивает ввод 'y' при каждой операции, я ищу решение, подобное $ ./script < echo 'yyyyyyyyyyyyyy'
чтобы передать все мои входные данные за один раз.
Существует команда, созданная специально для этого случая: yes
$ yes | ./script
Что это делает, так это подключает вывод yes
на вход из ./script
. Итак, когда ./script
запрашивает пользовательский ввод, вместо этого он получит вывод yes
. Выход из yes
это бесконечный поток y
за которым следует новая строка. Так что в основном, как если бы пользователь вводил y
на каждый вопрос о ./script
.
Если ты хочешь сказать "нет" (n
) вместо " да " (y
) вы можете сделать это так:
$ yes n | ./script
Обратите внимание, что некоторые инструменты имеют возможность всегда использовать asume yes
как ответ. Смотрите здесь, например: Обход запроса "да"/"нет" в 'apt-get upgrade'
Другие способы ввода входных данных:
Если вы точно знаете, сколько y
ваш сценарий ожидает, что вы сможете сделать это следующим образом:
$ printf 'y\ny\ny\n' | ./script
Новые строки (\n
) являются клавишами ввода.
С помощью printf
вместо yes
у вас есть более детальный контроль над вводом:
$ printf 'yes\nno\nmaybe\n' | ./script
Обратите внимание, что в некоторых редких случаях команда не требует от пользователя нажатия клавиши enter после символа. в этом случае не включайте новые строки:
$ printf 'yyy' | ./script
Для полноты картины вы также можете использовать вот документ:
$ ./script << EOFyyyEOF
Или, если ваша оболочка поддерживает это, здесь строка:
$ ./script <<< "yyy"
Или вы можете создать файл с одним вводом на строку:
$ ./script < inputfile
Если команда достаточно сложна и описанных выше методов больше недостаточно, вы можете использовать ожидать.
Вот пример супер простого сценария ожидания:
spawn ./scriptexpect "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
Это связано с тем, что грамматика оболочки допускает оператор перенаправления в любом месте командной строки. Что касается оболочки, ваша гипотетическая командная строка совпадает с этой строкой:
$ ./script 'yyyyyyyyyyyyyy' < echobash: echo: No such file or directory
Это означает ./script
будет вызван с аргументом 'yyyyyyyyyyyyyy'
и stdin получит входные данные из файла с именем echo
. И bash жалуется, так как файл не существует.
Используйте команду yes
:
yes | script
Выдержка из справочной страницы:
NAME yes - output a string repeatedly until killedSYNOPSIS yes [STRING]... yes OPTIONDESCRIPTION Repeatedly output a line with all specified STRING(s), or 'y'.
Некоторые вещи (apt-get
например) принять специальные флаги для запуска в беззвучном режиме (и принять значения по умолчанию). В apt-get
это дело, вы просто передаете его -y
флаг. Однако это полностью зависит от вашего сценария.
Если вам нужны более сложные вещи, вы можете обернуть свой сценарий в сценарий ожидания. 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_serverexpect "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
В сценарии оболочки вы также можете использовать следующий трюк с появлением, ожиданием и отправкой
spawn script.shexpect "Are you sure you want to continue connecting (yes/no)?"send "yes"
Однако в приведенном выше сценарии вам придется указать фразу, которую вы ожидаете получить во время выполнения скрипта для получения дополнительных примеров перейдите по следующей ссылке
Вы можете предоставить пользовательский ввод в свой скрипт с помощью cat
, из текстового файла, передаваемого в ваш скрипт с помощью bash
подобный этому:
cat input.txt | bash your_script.sh
Просто введите желаемый пользовательский ввод в свой input.txt файл, любые ответы, которые вы хотите - y, n, цифры, строки и т.д.
Хорошо, возможно, это не очень элегантное решение, но если вы запишете свои параметры в отдельный файл, а затем передадите его в качестве входных данных скрипту, это тоже сработает. Поэтому, если вы создадите новый файл со всеми вашими параметрами (назовите этот файл как 'options.in '), тогда вы можете легко запустить свой скрипт с ./script.sh < options.in
и редактируйте / создавайте различные файлы опций по мере необходимости.
Я писал сценарий bash с диалогом, и мне нужно было, чтобы это также происходило автоматически. Я сделал это, и это сработало как заклинание.
# -Wy force signaturewipe (if exists)echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog
Иногда опция -f
хорошо работает с определенными командами.