Como diferenciar um arquivo e saída do comando?

32

Normalmente você escreveria:

diff file1 file2

Mas eu gostaria de diferenciar um arquivo e sair do comando (aqui eu faço do comando um trivial):

diff file1 <(cat file2 | sort)

Ok, este trabalho quando eu insiro isso manualmente no prompt do shell, mas quando coloco exatamente a mesma linha no script de shell e, em seguida, executo o script, recebo um erro.

Então, a questão é - como fazer isso corretamente?

Claro que eu gostaria de evitar gravar a saída em um arquivo temporário.

greenoldman
fonte

Respostas:

39

Suspeito que seu script e seu shell sejam diferentes. Talvez você tenha #!/bin/shno topo do seu script como intérprete, mas esteja usando bashcomo seu shell pessoal. Você pode descobrir qual shell você executa em um terminal executando echo $SHELL.

Uma maneira mais fácil de fazer isso, que deve funcionar na maioria dos shells, seria usar um redirecionamento de pipe em vez do operador de leitura de arquivo que você fornece. O símbolo '-' é uma nomenclatura padrão para leitura de STDIN e pode ser usado frequentemente como um substituto para um nome de arquivo em uma lista de argumentos:

cat file2 | sort | diff file1 -

Ou para evitar um uso inútil do gato :

sort < file2 | diff file1 -
Caleb
fonte
Ah, você é bom, de fato, eu não verifiquei se sh é bash ou não. Muito obrigado pela solução.
greenoldman
É um arquivo diffing com stdout. Agora, como diferenciar stdout com um arquivo? Quero dizer, na direção oposta. é -Rno caso de utilizargit diff --no-index
Nakilon
@Nakilon Você apenas alterar a ordem argumento: diff - file1.
Caleb
Legal. Isso não funcionou git diff.
Nakilon
@ Nakilon Claro que não, por que faria? git diffé um animal completamente diferente e opera em referências a objetos glob em seu índice interno, não em arquivos; diffopera no sistema de arquivos. A -sintaxe é apenas para o açúcar sintático do shell /dev/stdin, o arquivo que representa o fluxo STDIN. Portanto, por diffque usá-lo como um substituto para um nome de arquivo. Enquanto isso, git diffnão está procurando arquivos, está procurando objetos, então você deve passar algo que ele reconheça. Não o utilize para comparar arquivos, use diffpara isso.
Caleb
-4

O escopo da entrada padrão é o próprio script, portanto, basta colocar seu código dentro de um bloco como este:

{
  diff file1 <(sort file2)
}

Desta forma, o escopo do STDIN está dentro do bloco.

Eu tentei e funciona.

tmow
fonte
Isso não é uma função, é um bloco e não faz nenhuma diferença.
Gilles 'SO- stop be evil'
@gilles Thx pela correção. BTW eu tentei a mim mesmo e funciona. Você fez?
tmow
3
O bloco não afeta a validade da <(…)construção. Seu script funcionará ou não, dependendo de você ser executado em um shell compatível <(…)ou não (ksh93 / bash / zsh vs Bourne / ash / kshk88). A resposta de Caleb diz tudo.
Gilles 'SO- stop be evil' -
1
@ gilles ok, thx pela explicação.
tmow