Подготовьте ответы на вопросы команды

14

Допустим, я хочу написать сценарий оболочки, который выполняет только одну команду. Но эта команда плохо разработана. Он не предлагает никаких параметров командной строки; вместо этого он задает некоторые вопросы и ждет ввода пользователя.

Есть ли способ подготовить этот ввод в сценарии, чтобы на вопросы отвечали автоматически?

tmuecksch
источник

Ответы:

16

Если команда не очень требовательна, она должна работать примерно так:

command > /dev/null << EOF
<answer 1>
<answer 2>
<answer 3>
EOF

Это требует, чтобы вы знали точные ответы заранее.

Бьорн Мунк
источник
Вы можете использовать приведенный выше ответ для разработки сценария упаковки. Новый скрипт должен прослушивать параметры и вызывать старую команду описанным выше методом.
Уолтер А
Также известный как ЗДЕСЬ документ, для получения дополнительной информации вы можете попробовать википедии здесь определение документа
OldTimer
15

Ожидать может сделать это. С сайта Expect :

Expect - это инструмент для автоматизации интерактивных приложений, таких как telnet, ftp, passwd, fsck, rlogin, tip и т. Д. Expect действительно делает эту вещь тривиальной. Expect также полезен для тестирования этих же приложений [...] »

Это приходит с большой помощью, как autoexpect .

Снова с сайта Expect,

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

Кристофер
источник
Спасибо за ваш ответ. Так как мои потребности очень низки, в моем случае Expect - это слишком много. Ответ Bjorns идеально подходит для моих нужд. Но я бы посоветовал сохранить ваш ответ для тех, кто нуждается в более сложном решении.
tmuecksch
+1, потому что я не знал, что autoexpect существует, и подумал, что кривая ожидаемого обучения была слишком крутой, чтобы я с ней беспокоился. Я еще раз посмотрю.
Джо
7

Если ваш сценарий ожидает одного ответа или нескольких запросов, в которых вы можете дать один и тот же ответ, есть yes:

NAME
       yes - output a string repeatedly until killed

SYNOPSIS
       yes [STRING]...
       yes OPTION

DESCRIPTION
       Repeatedly output a line with all specified STRING(s), or `y'.

Используйте это так:

yes Me | give_a_hug.sh
unperson325680
источник
3
Например, обычное ироническое употребление yes n, например:yes n | mv -i * somewhere/
Сэм Уоткинс