head behaviour

Bakul Shah bakul at bitblocks.com
Sat Jun 5 20:48:46 UTC 2010


On Sat, 05 Jun 2010 13:32:08 PDT Doug Barton <dougb at FreeBSD.org>  wrote:
> On 06/05/10 13:12, Bakul Shah wrote:
> > Consider:
> >
> > $ yes | cat -n | (read a; echo $a; head -1)
> > 1	y
> >       2	y
> >
> > $ yes | cat -n | (head -1; read a; echo $a)
> >       1	y
> > 456	y
> 
> It's not at all clear to me what you are trying to accomplish here. If 
> what you want is to read only the first line of the output of yes, then 
> what you'd want to do is:
> 
> yes | cat -n | head -1 | (read a; echo $a)
> 1 y
> 
> > As you can see, head reads far more than it should.  This is
> > fine most of the time but often it results in surprising
> > output:
> >
> > # print ps header and all lines with sh in it
> > $ ps|(head -1; grep sh)
> >    PID  TT  STAT      TIME COMMAND
> 
> I don't understand why you think this would work. There is no input to 
> the grep command. The only reason it exits at all is that you are 
> executing in a subshell.
> 
> > # print first and last two lines
> > $ look xa | (head -2; tail -2)
> > xanthaline
> > xanthamic
> 
> Same problem here. There is no input to the tail command.

In general this is not true.  Without running the following
can you guess its output?

$ look '' | (head -2; head -2)

Will it produce
    A
    a
or
    A
    a
    aa
    aal
or
    A
    a
    sive
    abrastol
or something else?

Yes, we can always find a work around for a given case but
the issue is that head buffers up more than it needs to.


More information about the freebsd-hackers mailing list