Как я могу автоматически отвечать на запросы в скрипте Linux Bash? [дубликат]
этот вопрос уже есть ответ здесь:
- есть bash скрипт ответа интерактивные подсказки 5 ответов
Я запускаю скрипт (я не могу его редактировать), и есть три вопроса "Да/нет". Как я могу автоматически ответить на эти вопросы? Мне нужно ответить Да, да, нет (в таком порядке).
2 ответов
труба к стандартному входному сигналу
некоторые скрипты могут принимать ответы от стандартного ввода. Одним из многих способов сделать это было бы:
$ 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