Si une commande change son comportement lorsque sa sortie est dirigée vers un terminal (par exemple, produit une sortie colorée), comment cette sortie peut-elle être redirigée dans un pipeline tout en préservant le comportement modifié? Il doit y avoir un utilitaire pour cela, dont je ne suis pas au courant.
Certaines commandes, par exemple grep --color=always
, ont des options pour forcer le comportement, mais la question est de savoir comment contourner des programmes qui reposent uniquement sur le test du descripteur de fichier de sortie.
Si cela compte, mon shell est bash
sous Linux.
Réponses:
Vous pourriez obtenir ce dont vous avez besoin en utilisant
unbuffer
.unbuffer
est untcl
/expect
script. Regardez la source si vous voulez. Notez également la section CAVEATS dans man.Notez également qu'il n'exécute pas d'alias tels que:
à moins d'ajouter un truc comme l'a noté Stéphane Chazelas:
Si vous faites un
alias unbuffer='unbuffer '
(notez l'espace de fin), les alias seront développés aprèsunbuffer
.la source
alias unbuffer='unbuffer '
(notez l'espace de fin), les alias seront développés aprèsunbuffer
.unbuffer
c'est!sudo apt install expect
- Ce n'était pas clair.Une histoire d'outils
Vous n'êtes pas la première personne à vouloir un tel outil. Les gens ont besoin de tels outils depuis 30 ans. Et ils existent aussi depuis presque aussi longtemps.
Le plus ancien outil pour ce genre de chose était le paquet "pty" de Daniel J. Bernstein, décrit par Rich Salz comme un "couteau de Ginsu", que Bernstein a écrit à la fin des années 1990 pour tricher à Nethack (sic!). La version 4 du paquet "pty" a été publiée en 1992
comp.sources.unix
(volumes 25 à 127, 127 à 135). Il est toujours localisable sur le World Wide Web. Paul Vixie l'a décrit à l'époque:Bernstein a par la suite mis à jour cette information, quelque part à compter du 1999-04-07, avec un paquet "ptyget", qu'il a annoncé:
Ce paquet séparé était le paquet "sess".
"ptyget" est d'ailleurs remarquable pour illustrer une version très ancienne du système de construction "redo" jamais publié de Berstein, et l'une des rares instances publiées.
dependon
est un précurseur clair deredo-ifchange
.Usage
ptybandage
ptybandage
est ce que les gens veulent généralement dans une session de connexion. Son principal cas d'utilisation consiste à créer des programmes qui sont sensibles au fait que leurs entrées, sorties ou erreurs standard sont connectées à des terminaux fonctionnent de cette manière, même s'ils se trouvent dans des pipelines shell ou que leurs descripteurs de fichier standard sont redirigés vers un fichier.Il faut une commande à exécuter (qui doit être une commande externe appropriée, bien sûr) et fonctionne de telle manière qu'il estime que son entrée standard, de sortie et d' erreur sont fixés à un terminal, reliant ceux jusqu'aux
ptybandage
« s entrée standard d'origine, sortie et erreur.Il traite des nuances de l'exécution sous des shells de contrôle de travaux, en s'assurant qu'un caractère STOP du terminal non seulement s'arrête,
ptybandage
mais arrête également l'exécution du programme lié au terminal interne.ptyrun
ptyrun
est ce que les gens veulent généralement dans les serveurs de réseau TCP. Son cas d'utilisation principal concerne les environnements d'exécution à distance qui n'ont pas eux-mêmes configuré des terminaux, exécutant des programmes qui ne fonctionnent pas comme ils le souhaitent sans terminal.Il ne s'attend pas à être exécuté sous un shell de contrôle de travail et si la commande en cours d'exécution reçoit un signal d'arrêt, elle est simplement redémarrée.
Outils disponibles
Dru Nelson publie les versions "pty" 4 et "ptyget".
Paul Jarc publie une version fixe de ptyget, qui tente de traiter les ioctls de périphériques pseudo-terminaux spécifiques au système d’exploitation dans l’original que les systèmes d’exploitation ne fournissent plus.
Le paquet source nosh est fourni avec workalike
ptybandange
et desptyrun
scripts, qui utilisent l'execline
outil de Laurent Bercot et les propres commandes de gestion pseudo-terminal du paquet nosh. Depuis la version 1.23 de nosh, ils sont disponibles pré-emballés dans le paquet nosh-terminal-extras. (Les versions antérieures ne les fournissaient qu'aux personnes ayant construit à partir des sources.)Quelques exemples d'utilisations
Jurjgen Oskam utilisant
ptybandage
sous AIX pour alimenter en entrée un document qui précède s'ouvre et lit son terminal de contrôle pour une invite de mot de passe:Andy Bradford utilise
ptyrun
sous OpenBSD sous daemontools et ucspi-tcp pour rendre lebgplgsh
programme de contrôle de routeur interactif accessible via le réseau tout en laissant croire qu'il parle à un terminal:Lectures complémentaires
redo
. Réponses fréquemment données.bgplgsh
. 8. Pages de manuel OpenBSD.la source
expect
?Vous pouvez utiliser socat pour démarrer votre processus avec un pty connecté et obtenir socat pour connecter l'autre extrémité du pty à un fichier. Quel AFAIU est exactement ce que vous avez demandé:
Cette méthode entraînera l'
isatty
appelé parmy-command
à retournertrue
et un processus qui s'appuiera uniquement sur celui qui sera trompé pour sortir les codes de contrôle. Notez que certains processus (notammentgrep
) vérifient également la valeur de laTERM
variable d'environnement. Vous devrez donc peut-être définir une valeur raisonnable, telle que"xterm"
la source
Il existe également une solution intéressante publiée ici sur Super User par KarlC :
Compilez une petite bibliothèque partagée:
Ensuite, indiquez à votre commande de charger ce
isatty(3)
remplacement de manière dynamique:Cela pourrait ne pas fonctionner pour toutes les commandes, voire en casser certaines de manière inattendue, mais fonctionnerait probablement dans la plupart des cas.
la source
DYLD_INSERT_LIBRARIES=./isatty.so DYLD_FORCE_FLAT_NAMESPACE=y mycommand
Que diriez-vous d'utiliser
script(1)
?Par exemple:
Sauvera la
ls
sortieout_file
avec les codes de couleur préservés.la source
out_file
avec ses couleurs?less -R
. Dans ce cas, cependant, je voulais que la sortie continue dans le pipeline, ce qui a fini par aboutir dans mon terminal. Àcat
titre d’illustration, c’est quelque chosescript -q -c 'ls -G' /dev/null | cat
qui supprimetypescript
complètement le fichier, ne laissant que la sortie du programme.-
) commescript
fichier de sortie, par exemple:script -q -c 'ls -G' -
Basé sur la réponse de @ Amir , voici un script qui génère puis inclut la bibliothèque au moment de l'exécution:
la source