2014-05-26 6 views
1

Вы можете использовать точку с запятой в оболочке bash, чтобы указать несколько команд. Иногда одна из этих команд вызывает вопрос, требующий ввода пользователем. (обычно «y»/«n» или что-то действительно) Если я знаю, о чем я хочу ответить заранее, есть ли способ как-то разобрать его на команды, как аргумент, или какой-то странный магический материал?Bash shell аргумент передача ...?

ответ

2

Вам не нужны никакие «странные магические материалы для труб», просто труба.

./foo ; echo "y" | ./bar ; ./baz 

Или волшебный herestring синтаксис, если вы предпочитаете:

./foo ; ./bar <<<"y" ; ./baz 
+0

Отличные ответы Мат, он отлично работает. Это все волшебное для меня.:) – cab00t

+0

Btw, я знаю, что это не место для комментариев, подобных этому, но вы один из моих абсолютных героев ... 0 задавали вопросы, 98k баллов. Я хочу быть как ты, когда я вырасту. Любовь, ура! :) – cab00t

2

Вы можете использовать команду yes положить много 'у «s к трубе.

Например, если вы хотите, чтобы удалить все текстовые файлы, вы можете использовать

yes | rm -r *.txt 

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

OUTPUT
yes n | rm -r *.txt 

Это будет в «N».

Для получения дополнительной информации см http://en.wikipedia.org/wiki/Yes_(Unix)

2

Для простого ответа «да» есть команда yes, доступный на большинстве Unix и Linux платформа:

$ yes | /bin/rm -i * 

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

+0

Рискованный пример! Кроме того, есть печально известное поведение rm, когда ваш каталог содержит файл с именем -f ... –

+0

Это пример 'yes', а не пример' rm'. – bobah

1

Иногда команда предоставляет возможность задать ответ по умолчанию на вопрос. Одним из примечательных примеров является apt-get - менеджер пакетов для Debian/Ubuntu/Mint. Он предоставляет и опции -y, --yes, --assume-yes для использования в неинтерактивных сценариях.

2

Во-первых, это не бас, который высказывает эти вопросы. Это конкретная программа (например, cp -i запрашивает перед перезаписыванием файлов). Часто эти команды также имеют переключатели для ответа на вопросы, например -y для fsck, или как -f переопределяет -i в rm. На многие программы можно было ответить через трубку, поэтому у нас есть команда «да», но некоторые идут на дополнительные длины, чтобы гарантировать, что они не могут; например, ssh при запросе паролей. Кроме того, в трубах нет ничего волшебного. Если программа только иногда задает вопрос, и имеет значение какой-то вопрос, есть инструменты, предназначенные для таких, как «ожидать».

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

echo -e '2+2\n5*3' | bc 

Если это больше кусок то здесь документ может быть полезным:

bc <<EOF 
2+2 
3*5 
EOF