Warum ist 'tail -f foo | grep . | cat' leer?

06/10/2010 - 01:41 von Alex Schuster | Report spam
Hallo!

Könnt ihr mir bitte folgendes erklàren?

Ich gebe eine Datei foo mit tail -f aus und pipe den Output durch ein grep.
Lenke ich nun aber noch die Ausgabe um in eine Datei oder pipe sie weiter,
kommt nix mehr:

wonko@weird ~ $ echo XXXXXXXXXXXXX > foo
wonko@weird ~ $ tail -f foo | grep .
XXXXXXXXXXXXX
^C
wonko@weird ~ $ tail -f foo | grep . | cat
^C

Das passiert unabhàngig von der verwendeten Shell. Lasse ich das '-f' beim
tail oder das 'grep .' weg, erhalte ich wieder eine Ausgabe.

Verwirrt,

Wonko
 

Lesen sie die antworten

#1 Alex Schuster
06/10/2010 - 02:10 | Warnen spam
Gerade hat's mir jemand erklàrt. Pipes verwenden (unter Linux) einen 4K
Buffer, und erst wenn der voll ist rutschen wieder Daten durch. Grep hat
dafür die Option --line-buffered, damit geht's.

Alternativ gibt es das Kommando 'stdbuf', mit man man Line buffering
aktivieren kann:

tail -f foo | stdbuf -o L grep . | cat
XXXXXXXXXXXXX

Das sind beides GNU-Features, und ich habe das Problem auf einer Sun mit
Solaris 2.6. Die Sunfreeware-coreutils haben kein stdbuf, aber ich nehme mal
an dass das Sunfreeware-grep die Option --line-buffered hat. Aber vielleicht
weiß noch jemand eine bessere Lösung?

Wonko

Ähnliche fragen