Інтерактивні підказки відповіді на bash script [дублікат]


109

Чи можливо, щоб сценарій bash автоматично обробляв підказки, які зазвичай подаються користувачеві з типовими діями? В даний час я використовую скрипт bash для виклику внутрішнього інструменту, який відображатиме підказки користувачеві (що вимагає Y / N) для завершення дій, проте сценарій, який я пишу, повинен бути повністю "від руки", тому Мені потрібен спосіб надіслати Y|Nв підказку, щоб дозволити програмі продовжувати виконання. Чи можливо це?


це не "автозавершення" ... як каже @unwind, це "автоматизація"
benzaita

3
Приклад використання yesдля цього: unix.stackexchange.com/questions/47344/…
Droogans

Відповіді:


65

Це не "автоматичне завершення", це автоматизація. Один поширений інструмент для цих речей називається очікуванням .

Ви також можете втекти, просто ввівши трубопровід yes.


3
На жаль, я не можу використовувати очікування, оскільки вони суворі вимоги до простору в системі, що працює в цьому, тому я не можу додавати додаткові пакети, але трубопровід yesробив трюк, на щастя, всі запити вимагали лише "у". Дякую.
TJ L

Однак Yes | commandможе працювати не завжди. Якщо це тільки для монтажу, то я скористався -yкращим варіантом.
Умеш Каушик

169

Простий

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

Це дозволяє передати будь-яку послідовність "Y" або "N" до вашого сценарію.


3
Якби мені потрібно було надсилати будь N-які, я б використав цей метод, але мені потрібні були лише Y, тому я пішов yes. Шкода, що я не можу прийняти дві відповіді, оскільки вони обидві правильні.
TJ L

3
;) Добре, якщо вам колись доведеться надіслати деякі N, тепер у вас є хороший спосіб це зробити.
Loïc Février

2
Це не працює для мене; пробіли не вважаються новими рядками --- якщо, наприклад, я повторюю "Y N", то він дає рядок "Y N"як вхід до першого підказки і завис у другому підказці, чекаючи, коли я завершу його. Я спробував змінити пробіли на нові рядки, але це теж не вийшло, але все-таки дав буквальний рядок підказки.
тимчасовий_користувач

52
спробуйте використовувати printf 'y\ny\ny\n' | ./your_script. Таким чином ви вручну вставляєте новий рядок для кожного очікуваного запису.
Маджід

8
printf '%s\n' Y Y N N Y N Y Y Nставить нові рядки між елементами, але не потрібен рядок великого формату.
Чарльз Даффі

16

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

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

Очікування не спрацювало так, як очікувалося для мене. Це найпростіша і найкраща відповідь на це питання.
cloudxix

12

Якщо у вас є лише Y для надсилання:

$> yes Y |./your_script

Якщо у вас є лише N для надсилання:

$> yes N |./your_script

9

У моїй ситуації мені потрібно було відповісти на деякі запитання без Y чи N, але з текстом чи порожнім. Я знайшов найкращий спосіб зробити це в моїй ситуації - створити файл оболонки. У своєму випадку я назвав це 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 у поєднанні з Return Lines, ви можете відповісти на кожне питання підказки за необхідності. Кожен новий рядок - нова відповідь.

Мій приклад просто показує, як це можна зробити з коментарями, також використовуючи символ `, щоб ви пам'ятали, що таке кожен крок.

Зауважте, що інша перевага цього методу полягає в тому, що ви можете відповідати більше, ніж просто Y або N ... адже ви можете відповісти пробілами!

Сподіваюся, це допоможе комусь вийти.


4

Для цього є спеціальна вбудована утиліта - " так ".

Щоб відповісти на всі запитання з однаковою відповіддю, ви можете запустити

yes [answer] |./your_script

Або ви можете помістити його всередині свого сценарію, щоб мати конкретну відповідь на кожне питання


як я можу це зробити всередині сценарію? Я маю на увазі вказати різні відповіді на кожне питання
Сенго
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.