2010-11-06 15 views
13

Prefiero no crear nuevos archivos. Quiero lograr algo similar a:¿Cómo puedo comparar la salida de dos comandos de Unix para encontrar la diferencia?

cmd1 > a 
cmd2 > b 
cat a b b | sort | uniq -u 

pero sin usar los archivos a y b.

+0

Relacionado: [Salida diferida de dos programas sin archivos temporales] (http://stackoverflow.com/questions/3800202/diff-output-from-two-programs-without-temporary-files), [¿Cómo difiero? el resultado de dos comandos?] (http://askubuntu.com/questions/229447/how-do-i-diff-the-output-of-two-commands) – kenorb

Respuesta

28

Las utilidades Unix generalmente están orientadas a archivos, por lo que nada hace lo que usted quiere.

Sin embargo, zsh puede autocreate archivos temporales con la siguiente sintaxis:

diff =(cmd1) =(cmd2)

También puede crear canalizaciones con nombre temporales (o usar los archivos especiales /dev/fdn hacer referencia a las tuberías anónimos) con

diff <(cmd1) <(cmd2)

Sin embargo, muchos diff s llaman a lseek() en su entrada, por lo que no funcionarán con canalizaciones con nombre.

(diff es, en general, un comando más útil para comparar la salida muy similar a la canalización de arriba.)

Consulte la sección "sustitución de proceso" de la página del manual "zshexpn" para más detalles.

+8

La sintaxis '<(cmd)' es bastante estándar uno que también es compatible con shells más ampliamente utilizados como bash. Lo he usado con diff en el pasado sin notar ningún problema. – Porculus

+0

Y, por supuesto, esto no solo dice con 'diff'. Lo uso para 'vimdiff' y otras herramientas también. – DerMike

Cuestiones relacionadas