Entendendo mal o propósito de uma substituição de processo

1

Acho que falta algum entendimento sobre os casos de uso de uma substituição de processo. Minha intuição era que uma substituição de processo, na forma <(COMMANDS) , executaria COMMANDS e, em seguida, alimentaria o resultado do programa em qualquer comando do qual faça parte, portanto command1 <(command2) avaliaria command2 e passaria o resultado como primeiro argumento em command1 .

Eu pensei que o seguinte teria funcionado:

$ for i in <(cat list.txt); do echo $i; done

onde list.txt é um arquivo contendo uma lista de palavras (separadas por novas linhas). Quando eu executo isso, ele simplesmente gera /dev/fd/63 , o que eu posso apenas supor é como um nome de caminho temporário para a saída da subshell criada na substituição do processo?

Eu pensei que o acima teria funcionado, porque funciona bem quando escrevo

$ for i in 'cat list.txt'; do echo $i; done

Eu nunca vi essa notação ' antes, o que significa exatamente? E que compreensão me falta sobre substituições de processos?

    
por user3002473 09.02.2018 / 03:01

1 resposta

6

'foo' é substituição de comando , não substituição de processo. $(foo) também é a substituição de comando e é a forma preferida, já que é mais fácil usar a substituição de comando aninhada: $(foo1 $(foo2 $(foo3 ...))) .

Com a substituição do comando, 'foo' / $(foo) , a saída de foo é usada como palavras na linha de comando. Então, for in $(echo a b c) se torna como se você tivesse usado for i in a b c . O comando na substituição do comando é executado primeiro, sua saída é obtida e, em seguida, a saída é usada para criar a próxima linha de comando, que é então executada, e assim por diante. Divisão de campo, expansão de caractere curinga, etc. ocorrem, portanto, a cotação é uma consideração importante na substituição de comando.

Com substituição de processos , <(foo) / >(foo) , o stdin / stdout do processo é fornecido como um arquivo, então cat <(foo) se torna como se você tivesse usado foo > /some/file e cat /some/file e tee >(foo) se tornasse como se você tivesse feito tee /some/file e foo < /some/file . Os comandos são executados simultaneamente. Como a saída não é vista pelo shell, a divisão de campo e a expansão de curingas não são uma preocupação.

    
por 09.02.2018 / 03:26