Сценарий bash отвечает на интерактивные запросы [дубликат]


110

Возможно ли, чтобы сценарий bash автоматически обрабатывал запросы, которые обычно представляются пользователю с действиями по умолчанию? В настоящее время я использую сценарий bash для вызова внутреннего инструмента, который будет отображать подсказки пользователю (с запросом «Да / Нет») для выполнения действий, однако сценарий, который я пишу, должен быть полностью автономным, поэтому Мне нужен способ отправить Y|Nв приглашение, чтобы программа продолжила выполнение. Это возможно?


это не «автозаполнение» ... как говорит @unwind, это «автоматизация»
benzaita

3
Пример использования yesдля этого: unix.stackexchange.com/questions/47344/…
Droogans

Ответы:


65

Это не «автозаполнение», это автоматизация. Один из распространенных инструментов для этих целей называется « Ожидание» .

Вы также можете обойтись простым вводом по трубопроводу из yes.


3
К сожалению, я не могу использовать expect, так как это строгие требования к пространству в системе, в которой он запущен, поэтому я не могу добавлять дополнительные пакеты, но подключение yesпо конвейеру помогло, к счастью, все подсказки в любом случае требовали только «y». Спасибо.
TJ L

Однако Yes | commandможет работать не всегда. Если это просто для установки, то я решил, -yчто это лучший и предпочтительный вариант.
Umesh Кошик

170

Простой

echo "Y Y N N Y N Y Y N" | ./your_script

Это позволяет вам передавать в сценарий любую последовательность «Y» или «N».


3
Если бы мне нужно было отправить какие N- либо , я бы использовал этот метод, но мне нужны были только Y, поэтому я пошел yes. Жаль, что я не могу принять два ответа, так как они оба правильные.
TJ L

3
;) Что ж, если вам когда-нибудь понадобится отправить что-то N, теперь у вас есть хороший способ сделать это.
Лоик Феврие,

2
У меня это не работает; пробелы не считаются новыми строками - если, например, я повторяю «ДА НЕТ», то он дает строку в "Y N"качестве ввода для первого приглашения и зависает во втором приглашении, ожидая, пока я его завершу. Я попытался заменить пробелы на новые строки, но это тоже не сработало, все равно выдал буквальную строку в подсказку.
temporary_user_name

52
попробуйте использовать printf 'y\ny\ny\n' | ./your_script. Таким образом, вы вручную вставляете новую строку для каждой ожидаемой записи.
Majid

8
printf '%s\n' Y Y N N Y N Y Y Nпомещает символы новой строки между элементами, но без одной большой строки формата.
Charles Duffy

16

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

cat "input.txt" | ./Script.sh

Expect у меня не сработал. Это самый простой и лучший ответ на этот вопрос.
cloudxix

12

Если у вас есть только Y для отправки:

$> yes Y |./your_script

Если у вас есть только N для отправки:

$> yes N |./your_script

9

В моей ситуации мне нужно было отвечать на некоторые вопросы без «Да» или «Нет», но с текстом или пробелом. Я обнаружил, что лучший способ сделать это в моей ситуации - создать файл сценария оболочки. В моем случае я назвал его autocomplete.sh

Мне нужно было ответить на несколько вопросов для экспортера схемы доктрины, поэтому мой файл выглядел так.

- Это только пример -

php vendor/bin/mysql-workbench-schema-export mysqlworkbenchfile.mwb ./doctrine << EOF
`#Export to Doctrine Annotation Format`                                     1
`#Would you like to change the setup configuration before exporting`        y
`#Log to console`                                                           y
`#Log file`                                                                 testing.log
`#Filename [%entity%.%extension%]`
`#Indentation [4]`
`#Use tabs [no]`
`#Eol delimeter (win, unix) [win]`
`#Backup existing file [yes]`
`#Add generator info as comment [yes]`
`#Skip plural name checking [no]`
`#Use logged storage [no]`
`#Sort tables and views [yes]`
`#Export only table categorized []`
`#Enhance many to many detection [yes]`
`#Skip many to many tables [yes]`
`#Bundle namespace []`
`#Entity namespace []`
`#Repository namespace []`
`#Use automatic repository [yes]`
`#Skip column with relation [no]`
`#Related var name format [%name%%related%]`
`#Nullable attribute (auto, always) [auto]`
`#Generated value strategy (auto, identity, sequence, table, none) [auto]`
`#Default cascade (persist, remove, detach, merge, all, refresh, ) [no]`
`#Use annotation prefix [ORM\]`
`#Skip getter and setter [no]`
`#Generate entity serialization [yes]`
`#Generate extendable entity [no]`                                          y
`#Quote identifier strategy (auto, always, none) [auto]`
`#Extends class []`
`#Property typehint [no]`
EOF

Что мне нравится в этой стратегии, так это то, что вы можете комментировать свои ответы, а использование EOF - это пустая строка (ответ по умолчанию). Кстати, у этого инструмента экспорта есть собственный JSON-аналог для ответа на эти вопросы, но я понял это после того, как сделал это =).

чтобы запустить скрипт, просто перейдите в нужный каталог и запустите его 'sh autocomplete.sh'в терминале.

Короче говоря, используя << EOL & EOF в сочетании со строками возврата, вы можете ответить на каждый вопрос приглашения по мере необходимости. Каждая новая строка - это новый ответ.

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

Обратите внимание на другое преимущество этого метода: вы можете ответить, используя не только «Да» или «Нет» ... фактически, вы можете отвечать пробелами!

Надеюсь, это кому-то поможет.


4

Для этого есть специальная встроенная утилита - « да ».

Чтобы ответить на все вопросы одним и тем же ответом, вы можете запустить

yes [answer] |./your_script

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


как я могу сделать это внутри скрипта? Я хочу указать разные ответы на каждый вопрос
Сенго
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.