Estou um pouco confuso com a seguinte sintaxe. Embora funcione, ele não entende por que funciona. Parece que existem dois tubos conectados ao comando diff. Mas não há apenas um STDIN
?
Exemplos:
diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)
bash
página de manual.Respostas:
Os pipes são simplesmente vinculados a descritores de arquivos diferentes de 0 (stdin):
É claro que um processo pode ter mais de um descritor de arquivo aberto por vez, portanto não há problema.
fonte
pipe()
chamada do sistema.pipe()
e bifurca os subprocessos. O processo principal não têm descritores de arquivos adicionais aberto se um pipe anônimo é usado. Esses descritores de arquivos adicionais são passados no formulário/dev/fd/...
e o processo geralmente os abre usando esses nomes de arquivos. Isso fará com que sejamdup()
editados, criando ainda mais descritores de arquivos abertos. O processo também pode usar o descritor de arquivo chamado imediatamente, sem quaisquer chamadas abertas ...a
, chamei-o como./a <(ls)
, e ele imprimiu com êxito a lista de arquivos, provando que o descritor de arquivo nomeado (63 no meu caso) já estava aberto. O bash pode usar pipes nomeados em um diretório temporário em arquiteturas diferentes do Linux; nesse caso, nenhum descritor de arquivo adicional seria aberto ao entrar no processo principal.