Quando você executa o ssh primeiro:
ssh remote 'cat file' | cat
ssh obtém seu terminal de controle como stdin, para que você possa digitar sua senha sem problemas.
Quando você usa a substituição de processos do bash, o stdin permanece conectado ao primeiro comando, e o canal de saída do subprocesso é passado para o primeiro comando como um argumento:
cat <(ssh remote 'cat file')
Se a negociação ssh tiver êxito, /dev/fd/63
será um canal contendo a saída de ssh remote 'cat file'
.
Isso pode ser demonstrado com o seguinte comando:
$ echo <(ls)
/dev/fd/63
A parte importante disso é que seu terminal está conectado à stdin de cat
, não à ssh
's . Quando isso é executado, cat
obtém um argumento de linha de comando como /dev/fd/63
. Portanto, o gato ignora completamente o stdin; no entanto, ele ainda está conectado ao processo cat, e não ssh
, por isso sua senha não chega a lugar nenhum.
Se você quiser mudar isso, você precisará executar ssh
primeiro e canalizar a saída para diff
, como você já demonstrou acima:
ssh remote 'cat file' | diff file -