redirección de salida de comando usando '- <<(...)'

10

Necesitaba extraer un shasum. Esto funciona, pero ¿alguien puede explicar por qué?

sed 's/^.*= //' -< <(openssl dgst -sha256 filename)

Estoy familiarizado con la $( )construcción, pero no puedo encontrar documentos para <( ), junto con -<, que supongo que está redirigiendo al sedSTDIN.

Sé que hay formas más fáciles, pero esta construcción me elude.

GlenH
fuente

Respuestas:

10

los

<(openssl dgst -sha256 filename)

construir es una sustitución de proceso . Crea un archivo (o FIFO) detrás de escena y devuelve su nombre a la secuencia de comandos.

< 

es una redirección de archivos regular, que redirige el contenido del archivo detrás de escena a stdiny

-

es un marcador de posición reconocido por sedpara indicar que su entrada proviene stdin.

Como sedes perfectamente capaz de leer archivos, -<parece innecesario en este contexto;

sed 's/^.*= //' <(openssl dgst -sha256 filename)

debería funcionar igual de bien.

conductor de acero
fuente
3
o simplementeopenssl ... | sed '...'
Miles
8

La <( COMMAND )construcción Bash se llama sustitución de proceso .

Evalúa el COMMANDinterior y redirige su salida a una FIFO, una tubería con nombre que obtiene un descriptor de archivo virtual /dev/fdasignado. Actúa como un archivo temporal que contiene la salida del comando evaluado.


La <construcción Bash se llama redirección de entrada .

Toma un descriptor de archivo en el lado derecho y redirige su contenido al STDIN (entrada estándar) del comando en el lado izquierdo.


El -no es una construcción Bash sino un argumentosed que especifica su archivo de entrada. El valor especial -significa leer desde STDIN (que también sedes el predeterminado, por lo que podría omitirse).


sed 's/^.*= //' - < <(openssl dgst -sha256 filename)

Esta línea primero se ejecuta openssl dgst -sha256 filenamey almacena en caché su salida en un FIFO. El descriptor de archivo que representa esta canalización con nombre se trata como un archivo de entrada que se redirige al STDIN de sed 's/^.*= //' -. Este sedcomando lee desde STDIN y elimina todos los caracteres antes de un símbolo "=" seguido de un espacio.

Byte Commander
fuente