Descritores de arquivo e redirecionamento no bash

4

Alguém pode explicar por que esse comando funciona:

gpg --enable-special-filenames --verify --batch \
  <(curl -s https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2.sig) \
  <(curl https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2)

E isso falha com "curl: (23) Falha ao gravar o corpo (0! = 4096) (23) Falha ao gravar corpo "mensagem de erro:

gpg --enable-special-filenames --verify --batch -- '-&3' '-&4' \
  3<(curl -s https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2.sig) \
  4<(curl https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2)
    
por kay 11.03.2016 / 09:35

1 resposta

5

Redirecionamentos para descritores de arquivos específicos usam 3< file . Substituição de processos usa <( ... ) . Para combinar os dois, você precisa usar ambos :

3< <( ... )

O espaço é importante. Caso contrário, ele é interpretado como uma tentativa de documento aqui que é terminado com ( , mas isso não é válido e você receberá um erro de análise.

Sua linha de comando gpg precisa ser:

gpg --enable-special-filenames --verify --batch -- '-&3' '-&4' \
    3< <(curl -s https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2.sig) \
    4< <(curl https://www.gnupg.org/ftp/gcrypt/gnupg/gnupg-2.0.29.tar.bz2)

Isso redireciona a saída do primeiro comando curl para o descritor 3 e o segundo para o descritor 4, exatamente da mesma maneira como se você os lesse de um arquivo normal.

A maneira como o <( ... ) funciona é que ele executa o comando com sua saída conectada a um FIFO ou a uma entrada em /dev/fd e, em seguida, <( ... ) é substituído na linha de comando pelo caminho para esse arquivo como um argumento comum, como se tivesse sido escrito lá no primeiro Lugar, colocar. O caminho do arquivo pode ser usado com outras construções, como redirecionamento.

Seu comando original acaba executando gpg ... 3/dev/fd/63 4/dev/fd/64 e, em seguida, curl descobre que ninguém está interessado no que está escrevendo e relata esse erro. Eu também recebi um erro do próprio gpg dizendo que esses arquivos não existem, embora ele tenha sido enterrado na saída curl .

    
por 11.03.2016 / 09:56