redirecionamento de saída de comando usando '- <<(…)'

10

Eu precisava extrair um shasum. Isso funciona, mas alguém pode explicar o porquê?

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

Eu estou familiarizado com a $( )construção, mas não consigo encontrar documentos para <( ), juntamente com -<, os quais eu assumo que estão redirecionando para o sedSTDIN.

Eu sei que existem maneiras mais fáceis, mas essa construção me escapa.

GlenH
fonte

Respostas:

10

o

<(openssl dgst -sha256 filename)

construção é uma substituição de processo . Ele cria um arquivo (ou FIFO) nos bastidores e passa seu nome de volta à sequência de comandos.

< 

é um redirecionamento regular de arquivo, redirecionando o conteúdo do arquivo dos bastidores para stdine

-

é um espaço reservado reconhecido por sedpara indicar que sua entrada é proveniente stdin.

Como sedé perfeitamente capaz de ler arquivos, isso -<parece desnecessário neste contexto;

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

deve funcionar tão bem.

chave de aço
fonte
3
ou apenasopenssl ... | sed '...'
Miles
8

A <( COMMAND )construção Bash é chamada substituição de processo .

Ele avalia o COMMANDinterior e redireciona sua saída para um FIFO, um pipe nomeado que recebe um descritor de arquivo virtual dentro de um local /dev/fddesignado. Ele age como um arquivo temporário que contém a saída do comando avaliado.


A <construção Bash é chamada de redirecionamento de entrada .

Ele pega um descritor de arquivo no lado direito e redireciona seu conteúdo para o STDIN (entrada padrão) do comando no lado esquerdo.


O -não é uma construção Bash, mas um argumento parased isso especifica seu arquivo de entrada. O valor especial -significa ler do STDIN (que também sedé o padrão, para que possa ser omitido).


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

Essa linha é executada openssl dgst -sha256 filenamee armazena em cache sua saída em um FIFO. O descritor de arquivo que representa esse pipe nomeado é tratado como arquivo de entrada que é redirecionado para o STDIN de sed 's/^.*= //' -. Este sedcomando lê STDIN e remove todos os caracteres antes de um símbolo "=" seguido por um espaço.

Byte Commander
fonte