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

Я запускаю скрипт, который запрашивает ввод '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"

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

Ожидать в пределах Bash

Вы можете предоставить пользовательский ввод в свой скрипт с помощью 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 хорошо работает с определенными командами.