Estoy ejecutando un script que solicita ingresar 'y' en cada operación, estoy buscando una solución como $ ./script < echo 'yyyyyyyyyyyyyy'
para pasar todas mis entradas a la vez.
Mejor respuesta
Hay un comando creado específicamente para ese caso:yes
$ yes | ./script
Lo que esto hace es conectar la salida de yes
a la entrada de ./script
. Así que cuando ./script
solicita la entrada del usuario, en su lugar obtendrá el resultado de yes
. La salida de yes
es un flujo interminable de y
seguido de una nueva línea. Básicamente, como si el usuario estuviera ingresando y
para cada pregunta de ./script
.
Si quieres decir que no (n
) en lugar de sí (y
) puedes hacerlo así:
$ yes n | ./script
Tenga en cuenta que algunas herramientas tienen una opción para asumir siempre yes
como respuesta Vea aquí, por ejemplo:omita el indicador de sí/no en 'apt-get upgrade'
Otros métodos para ingresar datos:
Si sabe exactamente cuántos y
su secuencia de comandos espera que pueda hacerlo así:
$ printf 'ynynyn' | ./script
Los saltos de línea (n
) son las teclas de entrada.
Usando printf
en lugar de yes
tiene un control más detallado de la entrada:
$ printf 'yesnnonmayben' | ./script
Tenga en cuenta que, en algunos casos excepcionales, el comando no requiere que el usuario presione Intro después del carácter. en ese caso, omita las líneas nuevas:
$ printf 'yyy' | ./script
En aras de la exhaustividad, también puede utilizar un documento aquí:
$ ./script << EOF
y
y
y
EOF
O si su shell lo admite, una cadena aquí:
$ ./script <<< "y
y
y
"
O puede crear un archivo con una entrada por línea:
$ ./script < inputfile
Si el comando es lo suficientemente complejo y los métodos anteriores ya no son suficientes, puede usar expect.
Este es un ejemplo de un script de expectativa súper simple:
spawn ./script
expect "are you sure?"
send "yesr"
expect "are you really sure?"
send "YES!r"
expect eof
Critica técnica:
La invocación de comando hipotético que diste en tu pregunta no funciona:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
Esto se debe a que la gramática de shell permite un operador de redirección en cualquier lugar de la línea de comandos. En lo que respecta al shell, su línea de comando hipotética es la misma que esta línea:
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
Eso significa ./script
será llamado con el argumento 'yyyyyyyyyyyyyy'
y el stdin obtendrá la entrada de un archivo llamado echo
. Y bash se queja porque el archivo no existe.