Obtenir une sortie colorisée inattendue sur plusieurs commandes


8

Je viens de l'ajouter à mon .bashrcpour obtenir une sortie colorisée avec less:

# Colorize less man pages.
export LESS_TERMCAP_md=$'\e[01;34m'
export LESS_TERMCAP_us=$'\e[01;33m'
export LESS_TERMCAP_so=$'\e[01;44;37m'
export LESS_TERMCAP_mb=$'\e[01;31m'
export LESS_TERMCAP_mr=$'\e[01;35m'
export LESS_TERMCAP_me=$'\e[00m'
export LESS_TERMCAP_ue=$'\e[00m'
export LESS_TERMCAP_se=$'\e[00m'

... et maintenant tout d'un coup, certaines commandes (qui semblent être liées à l'affichage des variables d'environnement) produisent une sortie couleur correspondant à ces nouveaux paramètres. Suis-je en train de m'échapper? Ou est-ce un comportement intentionnel? J'ai essayé quelques autres variantes d'échappement, mais elles ne fonctionnaient pas less.

Par exemple, voici une capture d'écran d'une envcommande.

commande env

php -i a également une sortie colorisée, mais uniquement dans la section des variables d'environnement.

commande php -i

Réponses:


4

C'est un comportement normal. Ces variables d'environnement contiennent des séquences d'échappement qui amènent le terminal à changer sa couleur de premier plan. Vous obtenez le même effet visuel lorsqu'un programme les génère, que ce lesssoit ou env.

Ces variables doivent contenir les caractères d'échappement réels, less ne fait aucun post-traitement sur eux.

Normalement, vous pouvez mettre moins de variables de configuration dans votre fichier lesskey , mais cela ne fonctionne pas pour les LESS_TERMCAP_xxvariables, car less les lit avant de lire le fichier lesskey (à partir de moins 444). Vous n'avez donc pas d'autre choix que de les mettre dans l'environnement.

Si vous souhaitez que ces variables s'appliquent uniquement à manet non à d'autres utilisations de less, vous pouvez utiliser un alias pour mandéfinir la PAGERvariable sur un script wrapper qui définit les variables d'environnement.

#!/bin/sh
escape=␛     # a literal escape character
export LESS_TERMCAP_md=$escape'[01;34m'

exec less "$@"

(Alternativement, utilisez #!/bin/bashsur la première ligne et vous pouvez utiliser la #'\e'syntaxe pour obtenir un caractère d'échappement. Sur les systèmes où se /bin/shtrouve le tiret, l'utilisation /bin/shest très légèrement plus rapide, même si elle peut ne pas être perceptible dans la pratique.)

Appelez ce script less-coloret ajoutez-le alias man='PAGER=less-color man'à votre ~/.bashrcou ~/.zshrc. Sur certains systèmes, au lieu de créer un alias, vous pouvez dire mand'utiliser un pager différent en définissant la MANPAGERvariable d'environnement: export MANPAGER=less-colordans votre ~/.profile.


1

Je suppose que vous avez par erreur défini ces valeurs de variables LESS_ * sur des chaînes qui contiennent des caractères d'échappement réels, par opposition aux chaînes qui contiennent une barre oblique inverse suivie d'un e. Ainsi, chaque fois que vous affichez ces valeurs, elles changent la couleur de votre terminal.

J'examinerais très attentivement les paramètres que vous avez définis dans votre .bashrc et m'assurerais qu'ils sont corrects. Je soupçonne que tout ce que vous devez faire est d'éliminer le signe dollar.


La suppression du signe dollar gâche mes pages de manuel. Par exemple, man top= \e[01;34mSYNOPSIS\e[00mau lieu de coloriser le mot "SYNOPSIS".
Jeff

Le signe dollar n'a pas fonctionné. Pouvez-vous penser à une solution de contournement? Peut-être un moyen de restreindre ces variables MOINS à être utilisées uniquement sur les pages de manuel?
Jeff

0

Comme @Gilles le souligne dans sa réponse, il s'agit d'un comportement attendu.

Permettez-moi d'ajouter quelques informations. LESS_TERMCAP_xxremplacer les capacités TERMCAP. Cette substitution est gérée par lesselle-même screen.cet la valeur est utilisée ultérieurement comme si elle avait été renvoyée par la bibliothèque TERMCAP. Cela signifie qu'il doit s'agir d'une séquence brute de caractères de contrôle.

Mon compte sur la façon de « solution » est d'envelopper lesslui - même

$ cat ~/bin/less 
#!/bin/bash

# Start bold mode
export LESS_TERMCAP_md=$'\e[1;37m'
# Start standout mode
export LESS_TERMCAP_so=$'\e[1;37;41m'
# End standout mode
export LESS_TERMCAP_se=$'\e[0m'
# Start underlining
export LESS_TERMCAP_us=$'\e[4;93m'
# End underlining
export LESS_TERMCAP_ue=$'\e[0m'
# End all mode like so, us, mb, md and mr
export LESS_TERMCAP_me=$'\e[0m'

exec /usr/bin/less "$@"

C'est drôle, je travaille là-dessus en ce moment et ça a l'air bien. Avez-vous une version qui fonctionne également #!/bin/sh(qui est dash, dans mon cas)? Je ne peux pas comprendre comment insérer un ESCcaractère littéral avec vim.
Jeff

1
@Jeff Du haut de ma tête, vous pouvez toujours faire quelque chose comme export LESS_TERMCAP_me="$(printf '\e[0m')". En fait, si vous regardez la réponse de @Gilles, il prétend qu'il export LESS_TERMCAP_me=$escape'[0m'devrait aussi fonctionner avec /bin/sh.
Miroslav Koškár
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.