At Wed, 24 Apr 2019 09:25:58 +0200, Andreas Krey <a.krey%gmx.de@localhost> wrote:
Subject: Re: uniq on open streams
>
> On Tue, 23 Apr 2019 11:50:23 +0000, Greg A. Woods wrote:
> ...
> >
> > Thinking "Oh, so it should work on FreeBSD too...", I opened a window to
> > my recently installed FreeBSD-12.0 machine, and after rewriting the Lua
> > code into AWK, I was surprised to see absolutely no output at all!
>
> stdout buffering is a thing. awk may not flush stdout, esp. when
> stdout is not a terminal. So uniq may not get anything.
>
> (echo a; echo b; echo c; sleep 3) | uniq -c
>
> is test case enough, and doesn't have the stdout buffer issue.
Awk does seem to flush stdout even when it feeds a pipe (and
incidentally has an "fflush" function just in case), but I've actually
ended up using:
{ echo a; echo b; echo c; read junk; } | uniq-apple
(Awk has "getline" too, but the shell variant is easier to type!)
Note, as this hints the Apple version (text_cmds-99) of FreeBSD's uniq
will build and run fine on NetBSD (with -D__APPLE__), and it does show
the 'c' line immediately.
However there's been so much churn (and what seems like entirely
unnecessary and mis-guided localization) both before and after that
version that I don't think it's useful to look at, though it does give a
hint as to how the algorithm might be changed for certain combinations
of command-line options to achieve the effect of printing each line
immediately when it differs from the line before (instead of only
printing the previous line, possibly with a count, when the current line
differs or EOF has been reached).
I don't see that changing this behaviour would ever be terribly useful
though since as you mentioned, stdout buffering is a thing (i.e. seeing
the output immediately only works if uniq's stdout is the tty. If it's
not the end of the pipeline then it will buffer its output too.
--
Greg A. Woods <gwoods%acm.org@localhost>
+1 250 762-7675 RoboHack <woods%robohack.ca@localhost>
Planix, Inc. <woods%planix.com@localhost> Avoncote Farms <woods%avoncote.ca@localhost>
Attachment:
pgpI66_dmi8jP.pgp
Description: OpenPGP Digital Signature