head behaviour

Bakul Shah bakul at bitblocks.com
Sat Jun 5 20:12:43 UTC 2010


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

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

# print first and last two lines
$ look xa | (head -2; tail -2)
xanthaline
xanthamic

Not quite what you expected, right?

Yes, you can use read and echo N times but this is not
as convenient as using head:

$ look xa | (read a; echo $a; read a; echo $a; tail -2)
xanthaline
xanthamic
xarque
Xaverian

The "fix" is to make sure head reads no more than $N bytes
where $N is the number of *remaining* lines to be read.
Yes this slows head down some but makes it more useful.
[Ideally all commands that quit after partially reading
their input ought to behave like this but that would slow
down their common use far too much]

Comments?

Thanks to Rob Warnock for pointing out the head problem.


More information about the freebsd-hackers mailing list