Por que a substituição do processo BASH não funciona com alguns comandos?

23

Ocasionalmente, a substituição do processo não funcionará como 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;}

Tenho notado falhas semelhantes com outros comandos (ou seja, o comando esperando o arquivo da substituição do processo não pode usar /dev/fd/63 ou similar). Esta falha com gcc é apenas a mais recente. Existe alguma regra geral que eu deveria estar ciente para determinar quando a substituição do processo falhará desta 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)

    
por Lotney 25.10.2014 / 02:00

1 resposta

27

A substituição do processo resulta em um arquivo especial (como /dev/fd/63 em seu exemplo) que se comporta como o final de leitura de um canal nomeado. Este arquivo pode ser aberto e lido, mas não escrito, não visualizado.

Comandos que tratam seus argumentos como fluxos puros funcionam enquanto comandos que esperam procurar em arquivos que recebem (ou escrever para eles) não funcionarão. O tipo de comando que funcionará é o que geralmente é considerado um filtro: cat , grep , sed , gzip , awk , etc ... Um exemplo de um comando que não funciona é um editor como vi ou uma operação de arquivo como mv .

gcc deseja poder executar acesso aleatório em seus arquivos de entrada para detectar em qual idioma eles são gravados. Se você der gcc uma dica sobre o idioma do arquivo de entrada, ficará feliz em transmitir o arquivo:

gcc -x c <(echo 'int main(){return 0;}')

A forma mais simples e direta sem substituição de processo também funciona:

echo 'int main(){return 0;}' | gcc -x c -

Observe que isso não é específico para bash . Todas as camadas que suportam a substituição do processo se comportam da mesma maneira.

    
por 25.10.2014 / 02:17