Here's an example using zsh (I assume it's the same using bash, but different using tcsh or sh):

diff <(find /usr/local -type f | sort) <(for each in /var/db/pkg/*/ +CONTENTS; do grep -v '^@' $each; done | sort)

This does a diff(1) of what /var/db/pkg says that /usr/local should look like, and what it *really* looks like (note that it would need some tuning in order to actually be useful, but you get the idea)

This uses the <() operator. What the <() operator does is create a named pipe in /tmp, execute the commands contained in the parenthesis in a subshell, and connect the stdout of the subshell into that named pipe. So it's sort of like using temp files, but you don't have to clean up after yourself. There's another, similar operator that does force it to use temp files, but I can never remember what it is :) Check the manpages for your shell

Note that not all programs support using named pipes instead of files, since they expect to be able to do things like rewind the current position in the file descriptor. diff(1) looks to support it okay, though.

A simplified version of your example would look like this:

diff <(cat foo) <(cat bar)



On 08 Sep 2006, at 06:10, Lasse Edlund wrote:

If I have two files "foo" and "bar" and try to run diff on them I write:
$diff foo bar
I can also write
$cat foo | diff - bar
But how do I give a program two (2) commands? not only to diff
but to any program that wants double input...
I wanna do
$cat foo | cat bar | diff - -
especially with echo commands that would be handy so I dont have to
create files!


_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to