GNU/Linux >> Tutoriales Linux >  >> Linux

Automatización de la entrada de texto desde un script bash sin usar EOF

Para casi todos los programas, tanto echo $i | myprogram -options y myprogram -options <<<$i debería funcionar, alimentando el programa $i a través de la entrada estándar.

<foo utilizará el contenido del archivo llamado foo como estándar.

<<foo utilizará el texto entre eso y una línea que consta únicamente de foo como entrada estándar. Este es un documento aquí (heredoc), como dijo Gilles; EOF en realidad no significa el final del archivo, es solo un delineador heredoc común (usamos "foo" en su lugar en este ejemplo).

<<<foo utilizará la cadena "foo" como entrada estándar. También puede especificar una variable $foo , y el shell usará su contenido como stdin, como mostré arriba. Esto se llama herestring , ya que usa una cadena corta en contraste con un bloque completo, como en un heredoc. Herestrings funciona en bash, pero no en /bin/sh .


La sintaxis recomendada por este sitio web se denomina documento aquí. La entrada al archivo programa comienza inmediatamente debajo de la línea que contiene <<EOF , y no termina con el final del script, sino con una línea que contiene exactamente el texto EOF (tenga cuidado de no tener espacios en blanco adicionales). Por cierto, puede usar cualquier marcador final que no contenga ningún carácter especial de shell:EOF no es una palabra clave, es simplemente tradicional.

#!/bin/bash
for i in {1..100}
do
   myprogram -options <<EOF
$i
EOF
   for j in {1..42}; do
     myprogram2 <<EOF
$i
$j
EOF
   done
done

aquí los documentos mencionados anteriormente por Kevin y Gilles, o una tubería simple funcionará en muchos casos.

Para situaciones más complicadas, es posible que desee buscar en Expect o similar (por ejemplo, el módulo Expect::Simple CPAN es una implementación de perl muy fácil de usar). Personalmente, prefiero el módulo Perl (Expect en sí mismo es tcl), pero existen implementaciones para muchos lenguajes de secuencias de comandos comunes. Incluso es posible escribir un muy implementación primitiva de la idea en sh o bash usando while y read.

La idea general de Expect y herramientas similares es esperar una cadena o patrón específico en la salida de un programa y luego alimentarlo con la entrada que desee.

Un ejemplo de uso común es automatizar el inicio de sesión, "esperando" (es decir, esperando) la cadena "ogin:", envíe el nombre de inicio de sesión, luego espere la cadena "palabra:" y envíe la contraseña.

Una última opción, si tiene el código fuente de myprogram, es simplemente modificarlo para que tome la entrada que desea darle como una opción de línea de comando. Esto podría ser un poco más de trabajo por adelantado, pero será mucho menos molesto que jugar con Expect o canalizar datos a un programa que no fue diseñado para usarse de esa manera.

... y no te olvides de enviar tu parche a myprogram backstream :) Incluso si no les gusta la forma en que lo codificaste, es posible que les guste la idea lo suficiente como para agregar la función ellos mismos. Los desarrolladores upstream tienden a apreciar a las personas que se mueven y contribuyen en lugar de demandar o quejarse.


Linux
  1. Canalizar hacia/desde el portapapeles en el script Bash

  2. Redirigir la entrada estándar dinámicamente en un script bash

  3. Ejecutar script bash desde URL

  4. automatizar la sesión de telnet usando scripts bash

  5. archivo de creación atómica si no existe desde el script bash

Evitar que un script bash se ejecute simultáneamente

¿Opción desconocida de Rsync de la ejecución del script Bash?

¿Obtener ruta completa desde dentro de Bash Script?

¿Es Rsync ~/foo Target/foo lo mismo que Rsync ~/foo/ Target/foo/?

¿Cómo saber si estoy en una sesión Tmux desde un script Bash?

¿Cómo verifico la sintaxis de un script Bash sin ejecutarlo?