rev, ainsi que pas mal d'utilitaires unix, ne se comporte pas de la même façon si leur sortie est redirigée ou non. Pour t'en convaincre, utilise strace :
(echo ceci est une phrase; sleep 2 ; echo a l endroit) | strace rev
Cela donne quelque chose comme ça, pour la sequence de lectures et d'écritures sur l'entrée/sortie standard :
read(0, "ceci est une phrase\n", 4096) = 20
write(1, "esarhp enu tse icec\n", 20) = 20
read(0, "a l endroit\n", 4096) = 12
write(1, "tiordne l a\n", 12) = 12
Avec la redirection, ça donne ça: (echo ceci est une phrase; sleep 2 ; echo a l endroit) | strace rev | rev
read(0, "ceci est une phrase\n", 4096) = 20
read(0, "a l endroit\n", 4096) = 12
read(0, "", 4096) = 0
write(1, "esarhp enu tse icec\ntiordne l a\n", 32) = 32
L'écriture n'a lieu que lorsque le programme source se ferme.
Tout cela dans le but d'avoir un affichage ligne à ligne lorsque affiché sur ton terminal et une meilleure performance (lecture et écriture par paquet de 4Ko) sinon.
# C'est rev
Posté par Benoît Monin . En réponse au message Flux dans un pipe. Évalué à 8.
(echo ceci est une phrase; sleep 2 ; echo a l endroit) | strace revCela donne quelque chose comme ça, pour la sequence de lectures et d'écritures sur l'entrée/sortie standard :
read(0, "ceci est une phrase\n", 4096) = 20
write(1, "esarhp enu tse icec\n", 20) = 20
read(0, "a l endroit\n", 4096) = 12
write(1, "tiordne l a\n", 12) = 12
Avec la redirection, ça donne ça:
(echo ceci est une phrase; sleep 2 ; echo a l endroit) | strace rev | revread(0, "ceci est une phrase\n", 4096) = 20
read(0, "a l endroit\n", 4096) = 12
read(0, "", 4096) = 0
write(1, "esarhp enu tse icec\ntiordne l a\n", 32) = 32
L'écriture n'a lieu que lorsque le programme source se ferme.
Tout cela dans le but d'avoir un affichage ligne à ligne lorsque affiché sur ton terminal et une meilleure performance (lecture et écriture par paquet de 4Ko) sinon.