GNU/Linux >> Tutoriales Linux >  >> Ubuntu

¿Ingresar automáticamente la entrada en la línea de comando?

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.

Relacionado:¿Cómo depurar la suspensión en Ubuntu?
Ubuntu
  1. ¿Cómo maneja Linux múltiples separadores de rutas consecutivas (/home////username///file)?

  2. ¿Cómo pasar un argumento de línea de comando a un script de Shell?

  3. ¿Ejecutar un comando una vez por línea de entrada canalizada?

  4. ¿Invocar un complemento de Firefox usando un comando?

  5. ¿Acceso al portapapeles de la línea de comandos?

Encuentre la ubicación geográfica del servidor Ubuntu a través de la línea de comandos

¿Reproductores de audio de línea de comandos?

¿Encontrar la línea de comando?

Al hacer el primer script de Bash, ¿no puede hacer que el comando Cd se 'pegue'?

¿Opciones de línea de comandos de Thunar?

el uso de < /dev/null &en la línea de comandos