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 stdinde 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 stdinno 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/0Funciona 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 queechono lee nada de stdin.cparchivar en ninguna parte.echo 1 2 3| cp /dev/fd/0 /dev/ttyimprimirá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/stdoutcomo archivo de salida. Este es un enlace simbólico/proc/self/fd/1en mi sistema. El descriptor de archivo 1 es stdout.fuente
pdftotextal 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 -cDesde la
pdftotextpá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
catcasi 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
catse puede eliminar:fuente
prog2escribe 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 ) |prog2prog1 input_file>(prog2)catprog2;&&catprog1cat$?prog2$?prog1Si 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
pdftotextguardará en un archivo de texto. Si bien su mejor opción (aparte de la obvia de usar-) es usar/dev/stdoutsegún lo sugerido por @TiCPU, también podría usar otra función de shell. La construcción se!:Nrefiere 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 quepdftotexttoma 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 elpdftotextcomando dando>(cat)un segundo argumento como respondió Digital Trauma, perocat <()aquí no tiene sentido. Obviamente, enpdftotextcaso 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 unacatpara la salida esa corriente. Normalmente, debemos ser capaces de hacer algo asípdftotext input.pdf -, pero al parecerpdftotextno 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.04tareas 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.ttydevuelve el nombre del terminal conectado astdout.fuente
ttyel 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/ttyprog1