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
.