когда я попытался с {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