Как мне автоматически ответить y в скрипте bash?

14

Я хочу удалить некоторую программу через скрипт bash. После запуска команды терминал спрашивает меня, уверен ли я, что хочу ее удалить. Поэтому мне нужно ответить y. Я хочу сделать это автоматически и ответить yчерез 10 секунд.

Я сделал этот пример, но он не работает -

#!/usr/bin
/opt/MNG/MNGVIEWHP/fe/uninstall
sleep 10
echo "y"

Есть идеи? Centos 7.2

Шалев Сезон
источник
6
ITYM, #! /bin/bash -а не#!/usr/bin
Стефан
проверьте, uninstallпринимает ли программа параметры или скрипт конфигурации или нет. Так будет проще
phuclv
1
Спросили и ответили до тошноты по всей сети. « это не работает» - не очень хорошее описание проблемы. Возможно, вы можете заявить, как ваша проблема отличается от бесчисленных других.
2
Что на самом деле делает ваш скрипт: запустите uninstallи дождитесь его завершения. Затем спите 10 секунд. Затем откликнитесь y\nна stdout (который все еще подключен к терминалу, а не к stdin какой-либо программы)
Peter Cordes

Ответы:

46

Для этого и нужна yesкоманда. Он выводит по yодному на строку в течение неопределенного времени, поэтому его можно передавать по командам, которые задают вопросы «да / нет».

yes | /opt/MNG/MNGVIEWHP/fe/uninstall

Это ответы yна все вопросы. Чтобы ответить nна все вопросы, замените yesна yes n. Для предопределенного сочетания yи nвы можете заменить yesна:

printf '%s\n' y n n y y n...

Или запустите его как:

/opt/MNG/MNGVIEWHP/fe/uninstall << 'EOF'
y
n
n
y
y
n
EOF

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

(sleep 10; echo y; sleep 2; echo n;...) | /opt/MNG/MNGVIEWHP/fe/uninstall

Но, вероятно, в этом нет необходимости, когда мы пишем yв канал, он будет там, uninstallчтобы читать его всякий раз, когда захочет его прочитать, вряд ли вам придется ждать, пока он будет готов прочитать его. Исключением будет, если uninstallрешит сбросить ввод, прежде чем задавать вопрос.

Все они предполагают, что uninstallкоманда просто читает каждый ответ как одну строку ввода со своего стандартного ввода.

Для более сложных случаев, когда команда читает ответы непосредственно с терминала , устройства или где вам нужно кормить ответы условно (например , на основе каких командных результатов), то, где вы бы использовать такие вещи , как expectи zsh«s zpty.

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

Стефан Шазелас
источник
Спасибо! Это хорошо, если нам нужно ответить только на один вопрос. Что случилось, если мы должны ответить на 20 вопросов, например?
Шалев
@Shalev, см. Редактировать.
Стефан
Спасибо ! Так что, если я хочу ввести другие значения, такие как interger (например, 2), мне нужно заменить его вместо «y»? printf '% s \ n' ynnyyn 2 3 ny | / opt / MNG / MNGVIEWHP / fe / uninstall
Шалев
Да, это идея.
Стефан
3
@ShalevSason, во всех решениях, которые я давал, как echo "y"и каждый раз, когда мы пишем y<newline>, имитируя нажатие, yа затем Enter. Если вы хотите смоделировать нажатие клавиши Enter в одиночку, это будет означать подачу пустой строки, поэтому printf '%s\n' y n '' 2 3(где ''пустая строка).
Стефан