Obtendo saída colorida inesperada em vários comandos

8

Acabei de adicionar isso ao meu .bashrc para obter saída colorida com 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'

... e agora, de repente, determinados comandos (parecem estar relacionados à exibição de variáveis de ambiente) produzem uma saída de cores que corresponde a essas novas configurações. Estou fugindo errado? Ou esse comportamento intencional? Eu tentei algumas outras variações de escape, mas elas não funcionaram com less .

Por exemplo, aqui está uma captura de tela de um comando env .

php-itambémtemsaídacolorida,masapenasnaseçãodevariáveisdeambiente.

    
por Jeff 18.08.2013 / 19:50

3 respostas

4

Esse é um comportamento normal. Essas variáveis de ambiente contêm seqüências de escape que fazem com que o terminal altere sua cor de primeiro plano. Você obtém o mesmo efeito visual quando qualquer programa os envia, seja less ou env .

Essas variáveis precisam conter os caracteres de escape reais, menos não faz nenhum pós-processamento nelas.

Normalmente, você pode colocar menos variáveis de configuração no seu arquivo menoschave , mas isso não funciona para o LESS_TERMCAP_xx variables, porque less as lê antes de ler o arquivo lesskey (a partir de menos 444). Então você não tem escolha a não ser colocá-los no ambiente.

Se você quiser que essas variáveis se apliquem somente a man e não a outros usos de less , você pode usar um alias para man que define a variável PAGER como um script wrapper que define as variáveis de ambiente .

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

(Como alternativa, use #!/bin/bash na primeira linha e você pode usar a sintaxe #'\e' para obter um caractere de escape. Em sistemas onde /bin/sh é traço, usar /bin/sh é um pouco mais rápido, embora possa não ser perceptível na prática.)

Chame este script less-color e adicione alias man='PAGER=less-color man' ao seu ~/.bashrc ou ~/.zshrc . Em alguns sistemas, em vez de criar um alias, você pode informar a man para usar um pager diferente definindo a variável de ambiente MANPAGER : export MANPAGER=less-color em seu ~/.profile .

    
por 19.08.2013 / 00:36
1

Suponho que você tenha configurado, por engano, os valores das variáveis LESS_ * para cadeias de caracteres que contêm caracteres de escape reais, em oposição às cadeias de caracteres que contêm uma barra invertida seguida por um e. Assim, toda vez que você exibe esses valores, eles mudam a cor do seu terminal.

Eu observo com muito cuidado as configurações que você fez no seu .bashrc e garanto que elas estão corretas. Eu suspeito que tudo que você precisa fazer é eliminar o cifrão.

    
por 18.08.2013 / 20:06
0

Como @Gilles aponta em sua resposta, esse é um comportamento esperado.

Deixe-me adicionar informações de par. LESS_TERMCAP_xx substitui os recursos do TERMCAP. Essa substituição é gerenciada por less em screen.c e o valor é usado apenas mais tarde, como se fosse retornado pela biblioteca TERMCAP. Isso significa que tem que ser uma sequência bruta de caracteres de controle.

Minha conta sobre como "corrigir" isso é envolver less em si

$ 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 "$@"
    
por 19.08.2013 / 12:00