Relacionado con una pregunta que hice en Stack Overflow: ¿ Pasar varias líneas de código a wsadmin.sh?.
Tengo, como una cadena, algunas líneas de entrada que necesito alimentar en un comando. El comando, sin embargo, solo acepta un archivo lleno de entrada.
¿Hay alguna forma de que pueda almacenar las líneas en un archivo o tubería temporal que nunca se escribe en el disco y luego introducirlo directamente en el programa?
¿Cómo hago para adquirir la tubería, alimentar la entrada, pasar esa tubería al comando y luego deshacerme de la tubería?
                    
                        linux
                                command-line
                                bash
                                
                    
                    
                        ArtOfWarfare
fuente
                
                fuente

Respuestas:
Otra solución es usar la sustitución de procesos en Bash. Si su sistema ha nombrado tuberías, puede usar esta función.
Se usa así:
donde
listhay una secuencia de comandos de shell (en realidad tuberías; los detalles completos están aquí ).listse ejecutará y su salida se conectará a la tubería. El nombre de la tubería se pasa a su programa.NOTA: no se permiten espacios entre
<y(.(La otra sustitución
>(list)también funciona como es de esperar).En su caso específico, podría usar
aunque puede encontrar la solución de @ meuh para ser más elegante.
Actualización: En la Guía avanzada de secuencias de comandos de Bash encontrará muchos ejemplos de uso .
fuente
Puedes usar un bash here-doc . Por ejemplo,
Si tiene algo en una variable bash, también puede interpolarlo: por ejemplo
<<<"path is $PATH".Si su comando insiste en un nombre de archivo, puede darle
/dev/stdin. P.ej:produce la salida de:
s/b/b/.fuente
stdin, y si no, esto no va a funcionar. Espero que el OP aclare."-f" option must be followed by a file name.-fy un nombre de archivo, proporcione el nombre de archivo/dev/stdin. Mira mi edición./dev/stdinsugerencia. El programa al que intento llamar solo acepta un nombre de archivo, así que lo he combinado/dev/stdincon un heredoc.Dependiendo de lo que esté en el script, puede usar el nombre de archivo especial - (menos) que significa stdin
Otro método que puede funcionar para usted es abrir el archivo
/dev/fd/0que nuevamente significa stdin .Una tercera opción puede ser crear un FIFO (Primero en entrar, primero en salir). Es como un archivo, pero tiene dos extremos: escribe en un extremo y lee desde el otro.
fuente
-esta manera: no es una característica del shell o del sistema operativo. Aunque, por lo que sé, la mayoría de las utilidades estándar de Linux siguen esta convención.expect.<()solución, pero más explícitas, ¡lo cual puede ser muy útil!Hay otra opción similar a la
mycmd -solución, pero incluso para programas que no manejan-específicamente:/dev/stdinparece estar relacionado con el sistema operativo y funciona para mí en Debian GNU / Linux, pero no estoy seguro de dónde funcionará también.fuente
^D?^Des una notación común para presionar Ctrl-D. ^ D tiene la semántica de "fin de flujo de entrada" aquí. Probablemente se ve con más frecuencia en^Co^Zqué significa presionar Ctrl-C respectivamente para presionar Ctrl-Z./dev/stdiny luego las cerraré?cat content | mycmd /dev/stdin. Solo imagine comandos diferentes quecataquí.