J'ai écrit un programme (en Ruby) et cela a bien fonctionné. Il imprime quelques lignes de texte, puis s'arrête une minute, puis répète ce qui précède.
Cela fonctionne bien (dans le terminal de Mac OS X), mais j'ai noté que si je voulais garder une trace de la sortie, en utilisant
ruby myscript.rb | tee record.txt
alors la sortie ne sera pas affichée à l'écran, jusqu'à ce que la sortie atteigne une certaine quantité, peut-être quelques ko. Cependant, cela pourrait signifier 5 ou 10 minutes sans rien à l'écran (et rien dans le fichier non plus si j'appuie sur CTRL-C).
Je pourrais modifier le programme pour vider la sortie, mais je pensais qu'une application devrait être agnostique quant à ce qui est utilisé avec la sortie vers STDOUT. Alors peut tee
être fait pour bien fonctionner (peut-être avec une option), ou toute autre commande pourrait être utilisée, ou peut-être est-ce une option de Bash ou de l'application Terminal ? Existe-t-il un moyen ?
Réponse acceptée :
Je pensais qu'une application devrait être agnostique quant à ce qui est utilisé avec la sortie vers STDOUT.
Vous avez mal pensé. Les bibliothèques d'exécution de plusieurs langages de programmation, y compris les langages C et C++, partagent toutes la sémantique de la modification de la mise en mémoire tampon selon qu'elles détectent ou non que le flux est attaché à un terminal.
C'est une partie définie de la langue dans de nombreux cas. La norme du langage C dit, par exemple :
Tel qu'initialement ouvert, le flux d'erreur standard n'est pas entièrement mis en mémoire tampon ; les flux d'entrée et de sortie standard sont entièrement mis en mémoire tampon si et seulement si le flux peut être déterminé comme ne faisant pas référence à un appareil interactif.
Le choix habituel si un flux n'est pas attaché à un périphérique terminal est de sélectionner la mise en mémoire tampon d'unité, la mise en mémoire tampon de ligne ou la mise en mémoire tampon complète. La mise en mémoire tampon d'unité et la mise en mémoire tampon de ligne sont habituelles pour l'erreur standard ; mise en mémoire tampon complète pour la sortie standard. Mais cela varie selon la langue.
Donc, pour que la sortie ne soit pas entièrement mise en mémoire tampon lorsque le flux de sortie est un tube dans de tels langages, vous devez
- écrire votre programme sur lui-même pour que la ligne de sortie standard soit mise en mémoire tampon, mise en mémoire tampon intelligente ou non ;
- utiliser des choses qui accrochent la bibliothèque d'exécution de votre langage de programmation particulier, comme le
stdbuf
commande si votre langage de programmation est C ou utilise (la partie des flux d'E / S de) la bibliothèque d'exécution C comme base (ce que certains langages de programmation ne font pas); ou - utiliser des outils tels que
ptybandage
qui font croire au programme que sa sortie standard est un terminal, tout en prenant cette sortie et en l'envoyant à l'extrémité d'écriture du tube.
Autres lectures
- https://unix.stackexchange.com/a/249801/5132