10
votes

Bash tee retirer la couleur

Je suis actuellement en train d'utiliser ce qui suit pour capturer tout ce qui va au terminal et jetez-le dans un fichier journal xxx

Cependant, je ne veux pas de couleur de couleur d'évacuation / encombrement aller dans le fichier journal. J'ai donc quelque chose comme celui-ci que sorta fonctionne xxx

sauf lis attend le retour du chariot qui n'est pas idéal pour certaines parties du script (par exemple echo -n "..." ou printf sans \ n ).


Suivi de Jonathan Leffler's Réponse:

Compte tenu de l'exemple script test.sh : xxx

  1. La sortie sur le terminal est comme prévu et il n'y a pas de code d'évacuation de couleur / encombrement dans le fichier journal tel que désiré. Toutefois, lors de l'examen test.log , je ne vois pas le [lecture] ... (voir la ligne 21 de test.sh ). < / p>

  2. Le fichier journal [de mon script Bash actuel] contient la ligne fichier journal: ... à la fin de celui-ci, même après la fermeture des 4 et 5 FDS. J'ai pu résoudre le problème en mettant un Sleep 1 avant la seconde EXEC - Je suppose qu'il y a une condition de course ou des shenanigans fd à la blâmer. Malheureusement pour vous les gars, je ne suis pas en mesure de reproduire ce problème avec test.sh mais je serais intéressé par n'importe quelle spéculation que tout le monde peut avoir.


1 commentaires

Notez que les codes \ e [... m sont spécifiques à VT100 / VT200 / etc. et peut ne pas être ceux qui ont réellement été émis par le programme sur un type différent de $ de mandat.


6 Réponses :


2
votes

Je sais que ce n'est pas une solution parfaite, mais cat -v fera des caractères non visibles tels que \ x1b pour être converti en forme visible comme ^ [[ 1; 34m . La sortie sera en désordre, mais ce sera au moins un texte ASCII.


0 commentaires

0
votes

Vous pouvez tenter d'utiliser l'option -N pour la lecture. Il se lit en n caractères au lieu d'attendre une nouvelle ligne. Vous pouvez la définir à un. Cela augmenterait le nombre d'itérations que le code fonctionne, mais cela n'attendrait pas les lignes neuves.

de l'homme:

-N NCHARS Lire les retours après avoir lu des caractères NCHARS plutôt que d'attendre une ligne complète d'entrée.

Remarque: je n'ai pas testé cette


0 commentaires

5
votes

envisagez d'utiliser le programme PEE Discuté dans est-il possible de distribuer STDIN sur des processus parallèles . Cela vous permettrait d'envoyer les données du journal via votre script SED, tout en continuant d'envoyer les couleurs à la sortie réelle.

Un avantage majeur de ceci est que cela supprimerait le "Execute sed une fois par ligne de sortie de journal"; C'est vraiment diabolique pour la performance (en termes de nombre de processus exécutés, si rien d'autre).


1 commentaires

excellent! Merci! EXEC 4 <& 1 5 <& 2 1> & 2> &> (TEE -A> (SED -R 'S / \ x1B \ [([0-9] {1,2} (;; {1,2})?)? [M | k] // g '> $ log_file))



0
votes

Vous pouvez utiliser ANSIFilter pour dépouiller ou transformer la sortie de la console avec des séquences d'échappement ANI.

voir http://www.andre-simon.de/zip/download .html # ansifilter


0 commentaires

1
votes

J'utilise pour faire des choses comme ceci en définissant term = mume avant d'exécuter ma commande. C'est à peu près supprimé tous les caractères de contrôle sauf pour TAB, CR et LF. Je ne sais pas si cela fonctionne pour votre situation, mais cela vaut la peine d'essayer. Le problème est que vous ne verrez pas de codages de couleur sur votre terminal, que ce soit un terminal muet.

Vous pouvez également essayer VIS ou chat (surtout le < code> -v paramètre) et voyez si ceux-ci font quelque chose pour vous. Vous les mettriez simplement dans votre pipeline comme ceci: xxx

d'ailleurs, presque tous les programmes terminaux ont une option pour capturer l'entrée et la plupart de la nettoyer pour vous . Quelle plate-forme êtes-vous sur et quel type de programme terminal utilisez-vous?


0 commentaires

0
votes

ne peut pas Screen -L -L ou le script Les commandes soient viables au lieu de cette boucle EXEC?


1 commentaires

Pouvons-nous désactiver les caractères de contrôle avec l'écran ?