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

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

144
задан 29 August 2013 в 16:05

7 ответов

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

$ yes | ./script

То, что это делает, соединить вывод yes к входу ./script. Итак, когда ./script просит ввод данных пользователем, из которого это вместо этого получит вывод yes. Вывод yes бесконечный поток y сопровождаемый новой строкой. Так в основном, как будто пользователь входит y для каждого вопроса ./script.

Если Вы хотите сказать "нет" (n) вместо да (y) можно сделать это как это:

$ yes n | ./script

Обратите внимание, что некоторые инструменты имеют опцию всегда принять yes как ответ. Посмотрите здесь, например: Обойдите да/нет, подсказка в 'Кв. - получает обновление'


Другие методы для ввода входа:

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

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

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

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

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

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

$ printf 'yyy' | ./script

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

$ ./script << EOF
y
y
y
EOF

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

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

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

$ ./script < inputfile

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

Вот пример супер простого, ожидают сценарий:

spawn ./script
expect "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' < echo
bash: echo: No such file or directory

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

262
ответ дан 29 August 2013 в 16:05

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

0
ответ дан 29 August 2013 в 16:05

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

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

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

Ожидайте в Bash

0
ответ дан 29 August 2013 в 16:05

Вы можете вводить пользовательский ввод в ваш скрипт с помощью cat из текстового файла, переданного в ваш скрипт с помощью bash, например:

cat input.txt | bash your_script.sh

Просто вставьте желаемый пользовательский ввод в ваш ввод. TXT-файл, ответы на любые вопросы - y, n, цифры, строки и т. д.

0
ответ дан 29 August 2013 в 16:05

Используйте команду 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'.
0
ответ дан 29 August 2013 в 16:05

Я писал сценарий bash для Dialog, и мне нужно, чтобы это происходило автоматически. Я сделал это, и это сработало как шарм.

# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog
0
ответ дан 29 August 2013 в 16:05

Некоторые вещи (например, 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
0
ответ дан 29 August 2013 в 16:05

Другие вопросы по тегам:

Похожие вопросы: