Сценарий bash отвечает на интерактивные запросы

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


person TJ L    schedule 27.09.2010    source источник
comment
это не автодополнение ... как говорит @unwind, это автоматизация   -  person benzaita    schedule 26.06.2012
comment
Пример использования yes для этого: unix.stackexchange.com / questions / 47344 /   -  person Droogans    schedule 22.09.2015


Ответы (6)


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

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

person unwind    schedule 27.09.2010
comment
К сожалению, я не могу использовать expect, так как это строгие требования к пространству в системе, в которой он запущен, поэтому я не могу добавлять дополнительные пакеты, но подключение yes in помогло, к счастью, для всех запросов в любом случае требовалось только «y». Спасибо. - person TJ L; 27.09.2010
comment
Однако Yes | command может работать не всегда. Если это просто для установки, то я решил, что -y - лучший и предпочтительный вариант. - person Umesh Kaushik; 14.03.2017
comment
Может Expect отвечать на запросы пароля? Например, git pull требует, чтобы я ввел свое имя пользователя и пароль. Пароль не отображается на экране, он скрыт. Может Expect справиться с этим? - person Xbox One; 11.11.2020

Просто

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

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

person Loïc Février    schedule 27.09.2010
comment
Если бы мне нужно было отправить какие-либо N, я бы использовал этот метод, но мне нужны были только Y, поэтому я выбрал yes. Жаль, что я не могу принять два ответа, так как они оба правильные. - person TJ L; 27.09.2010
comment
;) Что ж, если вам когда-нибудь понадобится отправить N, теперь у вас есть хороший способ это сделать. - person Loïc Février; 27.09.2010
comment
У меня это не работает; пробелы не считаются новыми строками - если, например, я повторяю "ДА НЕТ", тогда он дает строку "Y N" в качестве входных данных для первого приглашения и зависает во втором приглашении, ожидая, пока я его завершу. Я попытался заменить пробелы на новые строки, но это тоже не сработало, по-прежнему выдавала буквальную строку в подсказку. - person temporary_user_name; 28.05.2015
comment
попробуйте использовать printf 'y\ny\ny\n' | ./your_script. Таким образом, вы вручную вставляете новую строку для каждой ожидаемой записи. - person Majid; 22.06.2015
comment
Можно ли это сделать для обычных вызовов, например, «sudo git pull»? @ LoïcFévrier - person danielo; 07.02.2018
comment
printf '%s\n' Y Y N N Y N Y Y N помещает символы новой строки между элементами, но без одной большой строки формата. - person Charles Duffy; 22.06.2018
comment
@danielo, sudo и ssh необычны - они запрашивают из TTY, а не из стандартного ввода, по соображениям безопасности. Тем не менее, вы действительно не должны использовать sudo для запуска git. Лучше исправить ваши разрешения, чтобы ваша учетная запись обычного пользователя владела всеми задействованными файлами; выполнение операций контроля версий с повышенными привилегиями означает, что ошибка безопасности в git 0w затрагивает всю вашу коробку, а не только вашу личную учетную запись. - person Charles Duffy; 22.06.2018

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

cat "input.txt" | ./Script.sh
person Alex    schedule 22.07.2015
comment
Expect у меня не сработал. Это самый простой и лучший ответ на этот вопрос. - person cloudxix; 17.05.2020

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

$> yes Y |./your_script

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

$> yes N |./your_script
person douardo    schedule 16.11.2016

В моей ситуации мне нужно было отвечать на некоторые вопросы без «Да» или «Нет», но с текстом или пробелом. Я обнаружил, что лучший способ сделать это в моей ситуации - это создать файл сценария оболочки. В моем случае я назвал его 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 в сочетании со строками возврата, вы можете при необходимости ответить на каждый вопрос в подсказке. Каждая новая строка - это новый ответ.

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

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

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

person Joseph Astrahan    schedule 13.02.2017

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

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

yes [answer] |./your_script

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

person Asaf Pinhassi    schedule 25.11.2018
comment
как я могу сделать это внутри скрипта? я хочу указать разные ответы на каждый вопрос - person Sengo; 24.06.2020
comment
Это было бы полезно и для меня - person Nathaniel Rink; 11.02.2021