когда я попытался с {echo 2; echo 4}
и echo "2\n4\n"
застревает при первом выборе опции.
Мне не понятно, как вы это попробовали, но:
{echo 2; echo 4}
синтаксически неверен; ты хочешь { echo 2; echo 4; }
;
echo "2\n4\n"
просто печатает 2\n4\n
; Вы хотите echo -ne "2\n4\n"
(примечание: различные реализации echo
могут вести себя по-разному, но поскольку echo
является встроенным в bash
а вы пометили bash, я предполагаю, что вы используете встроенный).
Я бы сказал, что это может сработать:
for i in *; do { echo 2; echo 4; } | program "$i"; done
Я могу себе представить, что program
молча истощает и отбрасывает свой стандартный ввод перед тем, как запрашивать параметры, или использует другой прием, который приводит к сбою вышеуказанного решения. В этом случае попробуйте expect
, если доступно.
man 1 expect
состояния:
expect
это программа, которая "общается" с другими интерактивными программами по сценарию. Следуя сценарию, expect
знает, чего можно ожидать от программы и каков должен быть правильный ответ.
[...]
В общем, expect
полезно для запуска любой программы, которая требует взаимодействия между программой и пользователем. Все, что необходимо, - это то, что взаимодействие можно охарактеризовать программно.
Этот пример отправляет 2 и 4, когда программа запрашивает их:
expect -c '
spawn program ./input_file
expect "2. Option two"
expect "select an option:*"
send "2\r"
expect "4. Option four"
expect "select an option:*"
send "4\r"
expect eof'
Использование этого с переменными оболочки требует правильного цитирования и экранирования:
for i in *; do
expect -c "
spawn program \"$i\"
expect \"2. Option two\"
expect \"select an option:*\"
send \"2\r\"
expect \"4. Option four\"
expect \"select an option:*\"
send \"4\r\"
expect eof"
done