Il s'agit essentiellement d'une réponse négative. Il apparaît que ni dd
, ni mbuffer
, ni même ne pv
fonctionnent tous les cas, en particulier si le taux de données générées par le producteur peut varier considérablement. Je donne quelques tests ci-dessous. Après avoir tapé la commande, attendez environ 10 secondes, puis tapez >
(pour aller à la fin des données, c'est-à-dire attendre la fin de l'entrée).
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | dd bs=64K | less
Ici, après avoir tapé >
, il faut attendre 5 secondes, ce qui signifie que le producteur (script zsh) s'est bloqué avant le sleep 5
. L'augmentation de la bs
taille, par exemple à 32 Mo, ne change pas le comportement, bien que le tampon de 32 Mo soit suffisamment grand. Je soupçonne que c'est parce que les dd
blocs sur la sortie au lieu de continuer avec l'entrée. L'utilisation oflag=nonblock
n'est pas une solution car cela supprime les données.
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | mbuffer -q | less
Avec mbuffer
, le problème est que la première ligne (foo0) n'apparaît pas immédiatement. Il ne semble pas y avoir d'option pour activer la mise en mémoire tampon de ligne en entrée.
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | pv -q -B 32m | less
Avec pv
, le comportement est similaire à dd
. Pire encore, je soupçonne que cela fait du tort au terminal car parfois less
il ne peut plus recevoir d'entrée du terminal; par exemple, on ne peut pas le quitter avec q
.