GNU/Linux >> Tutoriels Linux >  >> Linux

Comment faire fonctionner n'importe quel programme avec la commande Tee ?

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.
En relation :Comment un programme décide-t-il d'avoir ou non une sortie colorée ?

Autres lectures

  • https://unix.stackexchange.com/a/249801/5132

Linux
  1. Comment capturer les sessions de terminal et la sortie avec la commande de script Linux

  2. Comment affecter la sortie d'une commande à une variable Shell ?

  3. Comment faire pour que Iconv remplace le fichier d'entrée par la sortie convertie ?

  4. Fermer la sortie standard (>&-) ?

  5. Dans un script bash, comment la commande Continuer fonctionne-t-elle avec les boucles intégrées ?

Comment utiliser la commande Linux sleep avec des exemples

Comment utiliser la commande Linux tee

Comment utiliser la commande who sous Linux avec des exemples

Comment utiliser la commande RPM (avec exemples)

8 Commande Linux Tee avec exemples

Comment rechercher des fichiers avec la commande fd sous Linux