web-dev-qa-db-fra.com

La sortie colorisée peut-elle être capturée via la redirection Shell?

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?

70
billc

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).

51
ataylor

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.

34
Walter Mundt

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:

  • Ubuntu 16.04
  • exécuter des tests de comportement avec behave et lancer la commande Shell pendant le test avec subprocess.check_call() de python

Solution:

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é
12
geekQ

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

10
alvherre

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).

8
Joels Elf

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.

2
Richard Wiseman