Now what would you expect this to print out?

Jonathan McKeown jonathan at hst.org.za
Tue May 20 09:30:48 UTC 2008


On Tuesday 20 May 2008 02:41, RW wrote:
> On Mon, 19 May 2008 21:46:03 +1200
>
> Jonathan Chen <jonc at chen.org.nz> wrote:
> > On Mon, May 19, 2008 at 01:49:35AM -0700, Garrett Cooper wrote:
> > > Riddle for the day for folks that have source trees... what would
> > > you expect this to print out (ask yourself the question and then
> > > execute the command)?
> > >
> > >      find /usr/src -name Makefile -or -name '*.mk' -print
> > >
> > > The expected output and what actual output differed in my mind, but
> > > maybe somebody else can "shed some light" on the logic behind what
> > > happened
> >
> > It's a problem that catches many young players with find(1). One has
> > to remember from reading the man-page that all directives have an
> > implicit AND operator on it; and that includes the "-print" directive.
> > So to get what you want, you have to introduce brackets:
> >
> >     find /usr/src \( -name Makefile -or -name '*.mk' \) -print
>
> Why does that make a difference, when print always evaluates to true?
>
> x AND true   =   x
>
> so
>
> (a OR b) AND true   =   a OR b
>  a OR (b AND true)  =   a OR b

It makes a difference (as in programming) because -print is used for its 
side-effect rather than its value, and the binding order influences when the 
side-effect happens.

Jonathan


More information about the freebsd-questions mailing list