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

6

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

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

Estou familiarizado com a construção $( ) , mas não consigo encontrar documentos para <( ) , juntamente com -< , que, presumo, está redirecionando para o sed STDIN.

Eu sei que existem maneiras mais fáceis, mas esse construto me ilude.

    
por GlenH 10.07.2016 / 22:14

2 respostas

7

O

<(openssl dgst -sha256 filename)

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

< 

é um redirecionamento regular de arquivos, redirecionando o conteúdo do arquivo "behind-the-scenes" para stdin e

-

é um marcador de posição reconhecido por sed para indicar que a sua entrada é proveniente de stdin .

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

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

deve funcionar também.

    
por steeldriver 10.07.2016 / 22:30
6

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

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

A construção < Bash é chamada 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 de Bash, mas um argumento para sed que especifica seu arquivo de entrada. O valor especial - significa que a leitura de STDIN (que também é o padrão de sed , pode ser omitida).

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

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

    
por Byte Commander 10.07.2016 / 22:38