when I tried with {echo 2; echo 4}
and echo "2\n4\n"
it gets stuck on the first option selection.
Não está claro para mim como você tentou isso, mas:
-
{echo 2; echo 4}
é sintaticamente inválido; você quer { echo 2; echo 4; }
;
-
echo "2\n4\n"
apenas imprime 2\n4\n
; você quer echo -ne "2\n4\n"
(nota: várias implementações de echo
podem se comportar de maneira diferente, mas como echo
é embutido em bash
e você marcou bash , eu suponho que você use o builtin).
Eu diria que isso pode funcionar:
for i in *; do { echo 2; echo 4; } | program "$i"; done
Eu posso imaginar program
silenciosamente esgota e descarta seu stdin antes de pedir opções, ou usa outro truque que faz a solução acima falhar. Nesse caso, tente expect
, se disponível.
man 1 expect
declara:
expect
is a program that "talks" to other interactive programs according to a script. Following the script, expect
knows what can be expected from a program and what the correct response should be.
[…]
In general, expect
is useful for running any program which requires interaction between the program and the user. All that is necessary is that the interaction can be characterized programmatically.
Este exemplo envia 2 e 4 quando o programa solicita:
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'
Usar isso com variáveis shell requer cotação e escape adequados:
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