Equivalência ao uso de substituição de processo?

0

É o uso de substituição de processos

command1 <(command2)

equivalente a

command2 > ~/myfile
command1 ~myfile

?

Os dois acima podem ser substituídos um pelo outro?

Será que command1 e command2 no uso de substituição de comandos são executados simultaneamente, enquanto no "substituto" command1 é executado somente depois que command2 terminar a execução?

Se sim, essa diferença torna os dois não equivalentes e nem sempre substituídos entre si em alguns casos?

Obrigado.

    
por Tim 01.08.2017 / 13:38

1 resposta

7

Esta é a substituição de processos .

O resultado final de ambas as formas que você dá deve ser basicamente o mesmo; as diferenças são que

  • como você aponta, a substituição de processo executa ambos os processos simultaneamente;
  • seu segundo formulário usa um arquivo em um sistema de arquivos, então você precisa de espaço para armazená-lo (e, idealmente, removê-lo depois).

Tecnicamente, a E / S entre processos envolvendo a substituição de processos se comporta como pipes, não como arquivos. (Isso pode muito bem ser um detalhe de implementação).

Os programas escritos corretamente não devem exibir diferenças em seus resultados porque eles são executados simultaneamente; por exemplo,

tail -n 1 <(seq 1 10000000)

mostra corretamente o último número na sequência, enquanto tenta fazer isso manualmente com

seq 1 10000000 > blah &
tail -n 1 blah

falhará porque tail mostra qual é a última linha armazenada no momento em que é executada, não espera que seq seja concluído. Seu segundo formulário aguarda corretamente neste caso.

Você pode, no entanto, ver diferenças no comportamento externo . Por exemplo,

head -n 1 <(seq 1 1000000000)

termina imediatamente (mesmo seq , graças ao comportamento do pipe), enquanto

seq 1 1000000000 > blah
head -n 1 blah

leva muito tempo para ser executado. Esse tipo de diferença pode significar que substituir um formulário pelo outro não é apropriado.

    
por 01.08.2017 / 13:50