Cria um arquivo temporário a partir de um redirecionamento ou canal stdout

5

Alguns comandos só são emitidos para stdout.
Algumas ferramentas funcionam apenas em arquivos.
Existe um comando que possa colá-los juntos?

Exemplo simples inventado:

diff $(echo 1 | stdout-to-temp-file) $(echo 2 | stdout-to-temp-file)

Meu caso de uso real; Solução atual:

git show HEAD:$1 > /tmp/left && meld /tmp/left $1

Meu caso de uso real; Desejado:

meld $(git show HEAD:$1 | stdout-to-temp-file) $1

Eu usaria isso em algumas outras situações também (ou seja, não estou procurando por um git ou meld apenas consertar).

    
por Vincent Scheib 07.10.2011 / 01:56

3 respostas

9

Você pode usar < para redirecionar sua saída para stdin .

Eu não sei como meld funciona, mas sobre o seu exemplo de comparação, veja como isso funcionaria:

Usando tempfiles

$ cmd1 > file1.tmp
$ cmd2 > file2.tmp
$ diff file1.tmp file2.tmp

Sem tempfiles

$ diff <(cmd1) <(cmd2)

Observe que a sintaxe pode variar um pouco de acordo com o shell que você está usando (estou usando o ksh88).

    
por 07.10.2011 / 15:12
9

mktemp criará um nome de arquivo temporário para você. Salve o nome do arquivo em uma variável e use-o em ambos os slots.

Para uma solução melhor para o seu problema, confira git difftool . Eu tenho a minha configuração para usar o meld, e é muito bom.

    
por 07.10.2011 / 02:00
3

Eu nunca usei o meld, mas você pode conseguir isso usando tipicamente o - argumento para a maioria dos utilitários cli. por exemplo,

cat /path/to/left/file | diff /input/from/right/file -

Especificamente para o seu comando meld, você pode tentar algo como:

git show HEAD:$1 | meld - $1
    
por 07.10.2011 / 14:55