La sortie colorisée peut-elle être capturée via une redirection de shell?

Diverses commandes bash que j’utilise – diffs, compilations, etc., génèrent beaucoup de couleurs.

Lorsque je redirige cette sortie vers un fichier, puis que le fichier est pris en compte plus tard, la colorisation a disparu – sans doute b / c, le fait de redirect la sortie a supprimé les codes de couleur indiquant au terminal de changer de couleur.

Existe-t-il un moyen de capturer une sortie colorisée, y compris la colorisation?

L’un des moyens de capturer une sortie colorisée consiste à script commande de script . Le script en cours démarrera une session bash où toute la sortie brute sera capturée dans un fichier (nommé typescript par défaut).

La redirection ne supprime pas les couleurs, mais de nombreuses commandes détectent lorsqu’elles envoient une sortie vers un terminal et ne produisent pas de couleurs par défaut si ce n’est pas le cas. Par exemple, sous Linux, ls --color=auto (qui est aliasé avec ls dans beaucoup d’endroits) ne produira pas de codes de couleur s’il est généré dans un tube ou un fichier, mais ls --color sera. De nombreux autres outils ont des indicateurs de remplacement similaires pour leur permettre de sauvegarder la sortie colorisée dans un fichier, mais tout est spécifique à chaque outil.

Même une fois que vous avez les codes de couleur dans un fichier, pour les voir, vous devez utiliser un outil qui les laisse intacts. less a un indicateur -r 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 reconnaît spécifiquement les codes de couleur et les affiche correctement, avec une meilleure prise en charge de choses comme le retour à la ligne / le rognage, car less peut déterminer quels sont les codes de contrôle aller à l’écran.

Certains programmes suppriment la colorisation lorsqu’ils réalisent que la sortie n’est pas un TTY (c’est-à-dire lorsque vous les redirigez vers un autre programme). Vous pouvez demander à certains d’utiliser la couleur avec force et dire au téléavertisseur d’activer la colorisation, par exemple utiliser less -R

J’ai trouvé que l’utilisation du script pour préserver les couleurs lorsque la diffusion était réduite ne marchait pas vraiment (moins tout est foutu et à la sortie, bash est complètement perturbé) car less est interactif. script semble vraiment gâcher les entrées provenant de stdin même après la sortie.

Donc au lieu de courir:

 script -q /dev/null cargo build | less -R 

Je redirige /dev/null vers ce dernier avant de redirect vers moins:

 script -q /dev/null cargo build < /dev/null | less -R 

Alors maintenant, le script ne joue pas avec stdin et me procure exactement ce que je veux. C'est l'équivalent de la command | less command | less mais cela préserve les couleurs tout en continuant à lire le nouveau contenu ajouté au fichier (les autres méthodes que j'ai essayées ne le feraient pas).

Inspiré par les autres réponses, j’ai commencé à utiliser le script . J’ai dû utiliser -c pour le faire fonctionner. Toutes les autres réponses, y compris le tee , les différents exemples de script ne fonctionnaient pas pour moi.

Le contexte:

  • Ubuntu 16.04
  • exécution de tests de behave avec behave et démarrage de la commande shell pendant le test avec le subprocess.check_call()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 passage de ma commande au script ne fonctionnait pas pour moi (pas de couleurs)
  • --return pour faire que le script propage le code de sortie de ma commande afin que je sache si ma commande a échoué

Cette question sur le superutilisateur m’a aidé quand mon autre réponse (impliquant le tee ) n’a pas fonctionné. Cela implique d’utiliser un unbuffer pour que la commande pense qu’elle fonctionne à 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 d’ apt , ironiquement.

J’utilise tee : mets la sortie de la commande dans le filename tee et elle garde la couleur. Et si vous ne voulez pas voir la sortie à l’écran (ce qui est le rôle du tee : afficher et redirect la sortie en même temps), alors envoyez simplement la sortie de tee à /dev/null :

command | tee | tee filename > /dev/null