Solución:
Para casi todos los programas, ambos echo $i | myprogram -options
y myprogram -options <<<$i
debería funcionar, alimentando el programa $i
a través de entrada estándar.
<foo
usará el contenido del archivo llamado foo
como stdin.
<<foo
utilizará el texto entre eso y una línea que consta únicamente de foo
como entrada estándar. Esto es un aquí documento (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. A esto se le llama herestring, ya que usa una cadena corta en contraste con un bloque completo, como en un heredoc. Herestrings funcionan en bash, pero no en /bin/sh
.
La sintaxis recomendada por este sitio web se denomina documento aquí. La entrada al programa de archivos 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
En este caso, los documentos mencionados anteriormente tanto por Kevin como por Gilles, o las tuberías simples funcionarán 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 hay implementaciones para muchos lenguajes de scripting 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 la fuente de myprogram, es simplemente modificarla para que tome la entrada que desea darle como una opción de línea de comando. Esto puede ser un poco más de trabajo por adelantado, pero será mucho menos agravante que jugar con Expect o canalizar datos en un programa que no fue diseñado para usarse de esa manera.
… y no te olvides de enviar tu parche a myprogram de nuevo en sentido ascendente 🙂 Incluso si no les gusta la forma en que lo has codificado, es posible que les guste la idea lo suficiente como para agregar la función ellos mismos. Los desarrolladores ascendentes tienden a apreciar a las personas que se mueven y contribuyen en lugar de exigir o quejarse.