Как я могу автоматически отвечать на запросы в скрипте Linux Bash? [дубликат]

этот вопрос уже есть ответ здесь:

  • есть bash скрипт ответа интерактивные подсказки 5 ответов

Я запускаю скрипт (я не могу его редактировать), и есть три вопроса "Да/нет". Как я могу автоматически ответить на эти вопросы? Мне нужно ответить Да, да, нет (в таком порядке).

2 ответов


попробуйте это:

echo -e "yes\nyes\nno" | /path/to/your/script

труба к стандартному входному сигналу

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

$ printf "%s\n" yes yes no | ./foo.sh 
yes yes no

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

используйте Expect для интерактивных подсказок

в то время как вы иногда можете уйти с использованием стандартного ввода, интерактивные подсказки обычно лучше обрабатывается такими инструментами, как ожидал. Например, учитывая скрипт foo.sh, вы можете написать foo.exp автоматизировать.

Примечание: вы также можете использовать autoexpect для создания скрипта из интерактивного сеанса, который при необходимости можно отредактировать. Я бы очень рекомендовал это для людей, новых, чтобы ожидать.

сценарий Bash: foo.sh

этот скрипт вы могли хотеть автоматизировать.

#!/usr/bin/env bash
for question in Foo Bar Baz; do
    read -p "${question}? "
    replies=("${replies[@]}" "$REPLY")
done
echo "${replies[@]}"

ожидать сценарий: foo.exp

вот упрощенный сценарий ожидания для автоматизации сценария Bash выше. Циклы Expect, ветвление и регулярные выражения могут обеспечить гораздо большую гибкость, чем показывает этот упрощенный пример, но это тут показать, как легко минимальный сценарий ожидания может быть!

#!/usr/bin/env expect
spawn -noecho /tmp/foo.sh
expect "Foo? " { send -- "1\r" }
expect "Bar? " { send -- "2\r" }
expect "Baz? " { send -- "3\r" }
interact

Пример Интерактивной Сессии

это то, что ваш интерактивный сеанс будет выглядеть, когда вы запустите ожидать скрипт. Он будет порождать ваш скрипт Bash и отвечать, как указано в каждой другой строке.

$ /tmp/foo.exp 
Foo? 1
Bar? 2
Baz? 3
1 2 3