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
list
hay una secuencia de comandos de shell (en realidad tuberías; los detalles completos están aquí ).list
se 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.
-f
y un nombre de archivo, proporcione el nombre de archivo/dev/stdin
. Mira mi edición./dev/stdin
sugerencia. El programa al que intento llamar solo acepta un nombre de archivo, así que lo he combinado/dev/stdin
con 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/0
que 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/stdin
parece 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
?^D
es 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^C
o^Z
qué significa presionar Ctrl-C respectivamente para presionar Ctrl-Z./dev/stdin
y luego las cerraré?cat content | mycmd /dev/stdin
. Solo imagine comandos diferentes quecat
aquí.