web-dev-qa-db-fra.com

grep ne génère pas avant EOF si tué à travers le chat

Compte tenu de cet exemple minimal

( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; )

il génère LINE 1 Et puis, après une seconde, sortira LINE 2, comme prév.


Si nous tuyons cela à grep LINE

( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | grep LINE

le comportement est le même que dans le cas précédent, comme prév.


Si, alternativement, nous tuyons cela à cat

( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | cat

le comportement est à nouveau la même, comme prév.


Toutefois, si nous tuyons à grep LINE, puis à cat,

( echo "LINE 1" ; sleep 1 ; echo "LINE 2" ; ) | grep LINE | cat

il n'y a pas de sortie avant une seconde, et les deux lignes apparaissent immédiatement sur la sortie, ce qui je ne m'attendais pas.


Pourquoi cela se produit-il et comment puis-je faire la dernière version à se comporter de la même manière que les trois premières commandes?

19
lisyarus

Utilisation

grep --line-buffered

pour que Grep ne tampon pas tampon plus d'une ligne à la fois.

7
choroba