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