Diverses commandes bash que j'utilise - des différences fantaisistes, des scripts de construction, etc., produisent beaucoup de couleurs.
Lorsque je redirige cette sortie vers un fichier, puis cat
ou less
le fichier plus tard, la colorisation a disparu - vraisemblablement b/c le fait de rediriger la sortie a supprimé les codes de couleur qui dites au terminal de changer les couleurs.
Existe-t-il un moyen de capturer la sortie colorisée, y compris la colorisation?
Une façon de capturer la sortie colorisée consiste à utiliser la commande script
. L'exécution de script
lancera une session bash où toute la sortie brute est capturée dans un fichier (nommé TypeScript
par défaut).
La redirection ne supprime pas les couleurs, mais de nombreuses commandes détectent quand elles envoient la sortie à un terminal et ne produisent pas de couleurs par défaut sinon. Par exemple, sous Linux ls --color=auto
(qui a pour alias plain ls
dans de nombreux endroits) ne produira pas de codes de couleur lors de la sortie vers un tube ou un fichier, mais ls --color
volonté. De nombreux autres outils ont des indicateurs de remplacement similaires pour les amener à enregistrer la sortie colorisée dans un fichier, mais tout est spécifique à l'outil individuel.
Même une fois que vous avez les codes couleur dans un fichier, pour les voir, vous devez utiliser un outil qui les laisse intacts. less
a un -r
drapeau pour afficher les données du fichier en mode "brut"; cela affiche les codes de couleur. edit: Les versions légèrement plus récentes ont également un indicateur -R qui est spécifiquement au courant des codes de couleur et les affiche correctement, avec un meilleur support pour des choses comme le retour à la ligne/rognage que le mode brut car moins peuvent dire quelles choses sont les codes de contrôle et qui sont en fait des caractères allant à l'écran.
Inspiré par les autres réponses, j'ai commencé à utiliser script
. J'ai dû utiliser -c
Pour le faire fonctionner. Toutes les autres réponses, y compris tee
, différents script
exemples ne fonctionnaient pas pour moi.
Le contexte:
behave
et lancer la commande Shell pendant le test avec subprocess.check_call()
de pythonSolution:
script --flush --quiet --return /tmp/ansible-output.txt --command "my-ansible-command"
Explication pour les commutateurs:
--flush
Était nécessaire, car sinon la sortie n'est pas bien observable en direct, en gros morceaux--quiet
Supprime la propre sortie de l'outil de script-c, --command
Fournit directement la commande à exécuter, le transfert de ma commande vers le script n'a pas fonctionné pour moi (pas de couleurs)--return
Pour que le script propage le code de sortie de ma commande afin que je sache si ma commande a échouécertains programmes suppriment la colorisation lorsqu'ils réalisent que la sortie n'est pas un ATS (c'est-à-dire lorsque vous les redirigez vers un autre programme). Vous pouvez demander à certains d'entre eux d'utiliser la couleur avec force et au pager d'activer la colorisation, par exemple, utilisez less -R
J'ai trouvé que l'utilisation de script
pour préserver les couleurs lors du transfert vers less
ne fonctionne pas vraiment (less est tout foiré et à la sortie, bash est tout foiré) car less est interactif. script
semble vraiment gâcher les entrées provenant de stdin
même après avoir quitté.
Donc au lieu de courir:
script -q /dev/null cargo build | less -R
Je redirige /dev/null
avant de passer à moins:
script -q /dev/null cargo build < /dev/null | less -R
Alors maintenant, script
ne joue pas avec stdin
et me donne exactement ce que je veux. C'est l'équivalent de command | less
mais il préserve les couleurs tout en continuant à lire le nouveau contenu ajouté au fichier (les autres méthodes que j'ai essayées ne feraient pas ça).
Cette question sur le superutilisateur m'a aidé lorsque ma autre réponse (impliquant tee
) ne fonctionnait pas. Cela implique d'utiliser unbuffer
pour faire croire à la commande qu'elle s'exécute à partir d'un shell.
Je l'ai installé en utilisant Sudo apt install expect tcl
plutôt que Sudo apt-get install expect-dev
.
J'avais besoin d'utiliser cette méthode lors de la redirection de la sortie de apt
, ironiquement.