Existe um comando criado especificamente para esse caso: yes
$ yes | ./script
O que o yes
faz é imprimir repetidamente y
seguido por uma nova linha para stdout. Se você conectar a saída de yes
a outro comando usando um canal (a barra vertical), então o y
seguido por nova linha irá para a entrada do outro comando.
Se você quer dizer não ( n
) ao invés de sim ( y
) você pode fazer assim:
$ yes n | ./script
Outros métodos para inserir entrada:
Se você sabe exatamente quantos y
seu script está esperando, pode fazer assim:
$ printf 'y\ny\ny\n' | ./script
As novas linhas ( \n
) são as chaves de entrada.
Usando printf
em vez de yes
, você tem um controle de entrada mais refinado:
$ printf 'yes\nno\nmaybe\n' | ./script
Observe que, em alguns casos raros, o comando não exige que o usuário pressione enter após o caractere. Nesse caso, deixe as novas linhas:
$ printf 'yyy' | ./script
Para fins de integridade, você também pode usar um documento aqui :
$ ./script << EOF
y
y
y
EOF
Ou se o seu shell for compatível com uma string :
$ ./script <<< "y
y
y
"
Ou você pode criar um arquivo com uma entrada por linha:
$ ./script < inputfile
Se o comando for suficientemente complexo e os métodos acima não forem mais suficientes, você poderá usar espera .
Nitropice técnico:
A invocação do comando hipotético que você forneceu na sua pergunta não funciona:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
Isso ocorre porque a gramática do shell permite um operador de redirecionamento em qualquer lugar na linha de comando. No que diz respeito ao shell, sua linha de comando hipotética é a mesma que esta linha:
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
Isso significa que ./script
será chamado com o argumento 'yyyyyyyyyyyyyy'
e o stdin receberá entrada de um arquivo chamado echo
. E o bash reclama porque o arquivo não existe.