Respuestas:
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
. Entonces, cuando ./script
solicita la entrada del usuario, en su lugar obtendrá la salida de yes
. La salida de yes
es un flujo interminable de y
seguido por una nueva línea. Básicamente, como si el usuario ingresara y
para cada pregunta de ./script
.
Si quiere decir no ( n
) en lugar de sí ( y
) puede hacerlo así:
$ yes n | ./script
Tenga en cuenta que algunas herramientas tienen la opción de asumir siempre yes
como respuesta. Consulte aquí, por ejemplo: omita el indicador yes / no en 'apt-get upgrade'
Otros métodos para ingresar la entrada:
Si sabe exactamente cuántos y
espera su script, puede hacerlo así:
$ printf 'y\ny\ny\n' | ./script
Las líneas nuevas ( \n
) son las teclas enter.
Usando en printf
lugar de yes
usted tiene un control de entrada más fino:
$ printf 'yes\nno\nmaybe\n' | ./script
Tenga en cuenta que, en algunos casos excepcionales, el comando no requiere que el usuario presione enter después del carácter. en ese caso, deje las nuevas líneas:
$ printf 'yyy' | ./script
En aras de la integridad 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, entonces puede usar esperar .
Aquí hay un ejemplo de un script de espera super simple:
spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof
Nitpick técnico:
La invocación de comando hipotética que proporcionó en su pregunta no funciona:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
Esto se debe a que la gramática del shell permite un operador de redireccionamiento en cualquier lugar de la línea de comando. 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
que se llamará con el argumento 'yyyyyyyyyyyyyy'
y el stdin obtendrá información de un archivo llamado echo
. Y bash se queja porque el archivo no existe.
cannot enable tty mode on non tty input
. ¿Conocerías una solución para eso?
printf
truco con un run
archivo que necesito para automatizar el proceso de instalación, todo lo que sucede es que recibo un mensaje de error que dice Warning: Tried to connect to session manager, None of the authentication protocols specified are supported
, y el script se abre en una nueva terminal y me pide que ingrese mi entrada manualmente como de costumbre. Por cierto, esto está sucediendo en Debian. ¿Alguna sugerencia?
Usa el comando yes
:
yes | script
Extracto de la página del manual:
NAME
yes - output a string repeatedly until killed
SYNOPSIS
yes [STRING]...
yes OPTION
DESCRIPTION
Repeatedly output a line with all specified STRING(s), or 'y'.
Algunas cosas ( apt-get
por ejemplo) aceptan indicadores especiales para ejecutarse en modo silencioso (y aceptan valores predeterminados). En apt-get
el caso, solo pasa una -y
bandera. Sin embargo, esto depende completamente de su script.
Si necesita cosas más complicadas, puede ajustar su script en un script de espera. esperar le permite leer la salida y enviar entradas para que pueda hacer cosas bastante complicadas que otras secuencias de comandos no permitirían. Aquí hay uno de los ejemplos de su página de Wikipedia :
# Assume $remote_server, $my_user_id, $my_password, and $my_command were read in earlier
# in the script.
# Open a telnet session to a remote server, and wait for a username prompt.
spawn telnet $remote_server
expect "username:"
# Send the username, and then wait for a password prompt.
send "$my_user_id\r"
expect "password:"
# Send the password, and then wait for a shell prompt.
send "$my_password\r"
expect "%"
# Send the prebuilt command, and then wait for another shell prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof
.sh
script de shell, ¿verdad? ¿O hay alguna manera?
En el script de shell también puede usar el siguiente truco de spawn, esperar y enviar
spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
Sin embargo, en el escenario anterior, deberá indicar la frase que espera obtener mientras ejecuta el script. Para obtener más ejemplos, vaya al siguiente enlace
De acuerdo, puede que esta no sea una solución muy elegante, pero si escribe sus opciones en un archivo separado y luego lo pasa como una entrada al script, también funcionaría. Entonces, si crea un nuevo archivo con todas sus opciones (llame a este archivo como 'options.in'), entonces puede ejecutar fácilmente su script ./script.sh < options.in
y editar / crear diferentes archivos de opciones según corresponda.
options.in
archivo? ¿Puede dar un ejemplo?
Estaba escribiendo un script bash con Dialog y necesitaba que esto también sucediera automáticamente. Hice esto y funcionó a las mil maravillas.
# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog
Puede proporcionar la entrada del usuario a su script con cat
, desde un archivo de texto, canalizado a su script de bash
esta manera:
cat input.txt | bash your_script.sh
Simplemente ingrese su entrada de usuario deseada en su archivo input.txt, cualquier respuesta que desee: y, n, dígitos, cadenas, etc.
-f
opción funciona bien con ciertos comandos.