Digamos que existe un programa, que toma dos argumentos; archivo de entrada y archivo de salida.
¿Qué pasa si no desea guardar el archivo de salida en el disco, sino más bien lo pase directamente a la stdin
de otro programa. ¿Hay una manera de lograr esto?
Muchos comandos que encuentro en Linux ofrecen una opción para pasar '-' como argumento del archivo de salida, que hace lo que he especificado anteriormente. ¿Es esto porque stdin
no es posible pasar el argumento de un programa como argumento? Si es así, ¿cómo lo hacemos?
Un ejemplo de cómo iba a imagen utilizando esto es:
pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" stdin(echo)
La cáscara que estoy usando es bash.
bash
io-redirection
arguments
Dziugas
fuente
fuente
cat <file | cmd /dev/fd/0
Funciona en la mayoría de las unidades.cat < README.txt | cp /dev/fd/0
. Decíacp: missing destination file operand after ‘/dev/fd/0’ Try 'cp --help' for more information.
program input-file /dev/stdout | another-program
? También tenga en cuenta queecho
no lee nada de stdin.cp
archivar en ninguna parte.echo 1 2 3| cp /dev/fd/0 /dev/tty
imprimirá1 2 3
. Y, por cierto,/dev/fd/[num]
es más probable que funcione que/dev/std(in|out|err)
en la mayoría de los casos. Consulte Portabilidad de enlaces de descriptor de archivo sobre qué puede esperar para trabajar en dónde.Respuestas:
Si interviene el programa escrito a cualquier descriptor de archivo, incluso si no se puede buscar, se puede utilizar
/dev/stdout
como archivo de salida. Este es un enlace simbólico/proc/self/fd/1
en mi sistema. El descriptor de archivo 1 es stdout.fuente
pdftotext
al igual que muchos (pero no todos) otras utilidades de soporte-
para que así (que funcionaría incluso en sistemas que no soportan / dev / stdout, o donde / dev / stdout no funcionan como se esperaba en Linux como en la salida estándar no es un tubo).pdftotext file.pdf - | wc -c
Desde la
pdftotext
página del manual:Entonces, en este caso, todo lo que necesita es:
O si lo desea tubería a este STDIN de otro programa:
El uso
-
como sustituto de un nombre de archivo es una convención que siguen muchas utilidades (incluido pdftotext) cuando queremos ingresar desde STDIN o enviar a STDOUT. Sin embargo, no todas las utilidades siguen esta convención. En ese caso, la forma idiomática para hacer esto en bash es utilizar una sustitución de proceso :Aquí se
>( )
comporta en gran medida como un archivo pasadomy_utility
, pero en lugar de ser un archivo real, la secuencia se canaliza al stdin del proceso contenido, es decir, cat. Entonces, aquí, el texto debería aparecer como se requiere.El uso de
cat
casi siempre activa las campanas de alarma UUOC en foros como este. Sostengo que si la utilidad no es compatible-
, entonces este es un uso útil decat
, aunque si hay alguna forma de hacer esta sustitución del proceso sin elcat
, entonces soy todo oídos ;-).Sin embargo, si (como dice la pregunta) el destino final de la transmisión es STDIN de otro programa, entonces
cat
se puede eliminar:fuente
prog2
escribe a la salida estándar, es mejor que , debido a las esperas de forma para que completa (es decir, antes de que los problemas de concha al siguiente mensaje o pasa a la siguiente orden (por ejemplo, después o )), mientras que el -sin forma solo espera a que se complete. Además, después del formulario, es el estado de salida de , mientras que, en el otro, es el estado de salida de . (Usted paga su dinero y le lleva a su elección.)prog1 input_file
>( cat ) |
prog2
prog1 input_file
>(
prog2
)
cat
prog2
;
&&
cat
prog1
cat
$?
prog2
$?
prog1
Si los soportes de concha ellos, la forma más sencilla de hacer tales manipulaciones sería el uso de sustitución de proceso :
<(…)
e>(…)
. Esto funciona de bash, zsh y ksh y posiblemente otros proyectiles. Por ejemplo:Sin embargo, esto no ayuda en el ejemplo del estado desde
pdftotext
guardará en un archivo de texto. Si bien su mejor opción (aparte de la obvia de usar-
) es usar/dev/stdout
según lo sugerido por @TiCPU, también podría usar otra función de shell. La construcción se!:N
refiere al enésimo argumento del comando anterior. Por lo tanto, se puede hacer:fuente
cat <()
puede ser útil en algunas situaciones, en este escenario, sin embargo, no está funcionando en absoluto. El problema (muy mal descrito por OP, debo admitir) es quepdftotext
toma dos argumentos: archivo de entrada y archivo de salida . Si falta un segundo argumento, entonces no produce nada, porcat <(pdftotext "file.pdf")
lo que tampoco devolvería nada. Uno puede engañar elpdftotext
comando dando>(cat)
un segundo argumento como respondió Digital Trauma, perocat <()
aquí no tiene sentido. Obviamente, enpdftotext
caso de que sea mejor usarlo-
como el nombre del archivo de salida.>( )
hará efectiva el flujo de la tubería a cualquier proceso que está dentro - así que en realidad no necesita unacat
para la salida esa corriente. Normalmente, debemos ser capaces de hacer algo asípdftotext input.pdf -
, pero al parecerpdftotext
no admite el-
parámetro de salida directamente a la salida estándar en lugar de un archivo - probarlo.>(grep something)
para ser más útil. Por cierto, mipdftotext 3.04
tareas de apoyo-
como un archivo de salida, así que estoy un poco sorprendido por toda la discusión.pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf"
, que coloca la salida en un archivo llamadoC BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.txt
, pero nada del texto se envía a STDOUT para canalizarlo a otro programa.tty
devuelve el nombre del terminal conectado astdout
.fuente
tty
el nombre de la terminal y luego use ese archivo como salida, por ejemplopdftotext file.pdf /dev/pts/2
. En ese caso, estoy de acuerdo.prog1 input_file
$(tty)
prog1 input_file
/dev/tty
prog1