Como é chamada a sintaxe bash '<(conteúdo do arquivo)'?


25

Esta resposta no Security StackExchange usa uma sintaxe interessante do bash para gerar um arquivo em linha:

openssl req -new -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout cert.key -out cert.crt -days 3650

Este bit é particularmente interessante:

<(openssl ecparam -name secp384r1)

Executando apenas:

echo <(openssl ecparam -name secp384r1)

eu voltei /dev/fd/63

Portanto, isso parece criar um descritor de arquivo temporário com o conteúdo do arquivo.

Como isso é chamado?


3
Observe que o "arquivo" resultante é realmente um pipe nomeado e alguns programas não os suportam como argumentos de arquivo. Exemplo: git diff --no-index file1 <(cat file2)falhará com: error: /dev/fd/63: unsupported file type. Você também pode ver error: readlink("/dev/fd/63"): No such file or directoryse a implementação cria um link simbólico para o canal (aparece como um link quebrado por algum motivo).
Kelvin

Respostas:


35

É chamado de substituição de processo e é um recurso do bash, zsh e ksh (e possivelmente outros, não sei). Não é POSIX e você não deve usá-lo em código portátil, mas é muito útil.

Aqui está a seção relevante do manual do bash:

3.5.6 Substituição de processo

A substituição de processo é suportada em sistemas que suportam pipes nomeados (FIFOs) ou o método / dev / fd para nomear arquivos abertos. Toma a forma de

  <(list) 

ou

  >(list) 

A lista de processos é executada com sua entrada ou saída conectada a um FIFO ou a algum arquivo em / dev / fd. O nome desse arquivo é passado como argumento para o comando atual como resultado da expansão. Se o formulário> (lista) for usado, a gravação no arquivo fornecerá entrada para a lista. Se o formulário <(lista) for usado, o arquivo passado como argumento deve ser lido para obter a saída da lista. Observe que nenhum espaço pode aparecer entre <ou> e o parêntese esquerdo, caso contrário, a construção seria interpretada como um redirecionamento.

Quando disponível, a substituição do processo é realizada simultaneamente com a expansão de parâmetro e variável, substituição de comando e expansão aritmética.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.