`unbuffer` ou` stdbuf` pour supprimer la mise en mémoire tampon stdout?

13

Y a-t-il une différence entre unbuffer (1) et stdbuf (1)? D'après ce que je comprends, unbuffer fait plus que le "meilleur effort" d'appeler la fonction libc set (X) buf au début, puis de laisser les choses être?

dan3
la source

Réponses:

14

Ils fonctionnent de manières complètement différentes.

Le programme non tampon utilise expect pour exécuter la commande nommée. Parce que expect crée un pseudo-tty à attacher à la sortie standard du processus enfant, l'enfant pourrait être dupe en pensant qu'il devrait utiliser la mise en mémoire tampon de ligne au lieu de la mise en mémoire tampon de bloc. Certains programmes changeront leur comportement lorsque isatty (stdout) est vrai, d'autres non et il est très difficile de savoir qui le fera et lequel ne le sera pas.

Le programme stdbuf tente de placer libstdbuf devant libc pour les binaires chargés dynamiquement. Où libstdbuf redéfinit la stratégie de mise en mémoire tampon par défaut des appels libc stdio.

Je l'ai découvert par

 apt-get source expect coreutils

et lire la source pertinente pour chaque programme.

msw
la source
Certaines choses inquiétantes (à partir de la page de manuel): unbuffer -ppeuvent sembler fonctionner de manière incorrecte si un processus alimentant l'entrée en déboucleur se ferme. Considérez: process1 | unbuffer -p process2 | process3Si processus1 se termine, le processus2 n'est peut-être pas encore terminé. Il est impossible pour le non-tampon de savoir longtemps à attendre
dan3
Il semble que stdbuf puisse également contrôler la mise en mémoire tampon stdin des programmes qui utilisent des flux C, ce qui semble important. Peut-être que cela devrait être inclus dans la réponse pour le bénéfice des futurs lecteurs.
dan3