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.