Como diferenciar um arquivo e uma saída do comando?

25

Normalmente você escreveria:

diff file1 file2

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

diff file1 <(cat file2 | sort)

Ok, este trabalho quando eu digito isso manualmente no prompt do shell, mas quando eu coloco exatamente a mesma linha no shell script, e então executo o script, eu recebo o erro.

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

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

    
por greenoldman 20.04.2011 / 22:46

2 respostas

32

Eu suspeito que seu script e seu shell sejam diferentes. Talvez você tenha #!/bin/sh no topo do seu script como o interpretador, mas está usando bash como 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 fornecido. O símbolo '-' é uma nomenclatura padrão para leitura de STDIN e pode freqüentemente ser usado 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 -
    
por 20.04.2011 / 22:51
-4

O escopo da entrada padrão é o próprio script, então coloque 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.

    
por 21.04.2011 / 00:26