Ocasionalmente, a substituição do processo não funcionará conforme o esperado. Aqui está um exemplo:
Entrada:
gcc <(echo 'int main(){return 0;}')
Saída:
/dev/fd/63: file not recognized: Illegal seek
collect2: error: ld returned 1 exit status
Entrada:
Mas funciona como esperado quando usado com um comando diferente:
grep main <(echo 'int main(){return 0;}')
Saída:
int main(){return 0;}
Eu notei falhas semelhantes com outros comandos (ou seja, o comando que espera o arquivo da substituição do processo não pode usar /dev/fd/63
ou semelhante). Essa falha gcc
é apenas a mais recente. Existe alguma regra geral que eu deva conhecer para determinar quando a substituição do processo falhará dessa maneira e não deve ser usada?
Estou usando esta versão BASH no Ubuntu 12.04 (também vi isso no arch e no debian):
GNU bash, versão 4.3.11 (1) -release (i686-pc-linux-gnu)
gcc -xc <(echo 'int main(){return 0;}')
(que define o idioma C
explicitamente).
illegal seek
parece a resposta - a|pipe
quebash
aponta o programa executado não é um arquivo procurável. Provavelmente, se você não conseguir obter êxitoecho data | command /dev/fd/0
em um programa, terá sorte semelhante com<(cmd)
. Ele não fornece um arquivo em disco - apenas substitui um argumento que aponta para um descritor de arquivo pipe.