Obtendo saída colorida inesperada em vários comandos

8

Acabei de adicionar isso ao meu .bashrcpara obter uma 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, certos comandos (parecem estar relacionados à exibição de variáveis ​​de ambiente) produzem saída de cores que corresponde a essas novas configurações. Estou escapando errado? Ou esse comportamento é intencional? Eu tentei algumas outras variações de fuga, mas elas não funcionaram less.

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

comando env

php -i também possui saída colorida, mas apenas na seção de variáveis ​​de ambiente.

Comando php -i

Jeff
fonte

Respostas:

4

Este é 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 produz, seja ele lessou env.

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

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

Se você deseja que essas variáveis ​​se apliquem apenas a manoutros usos de less, não é possível usar um alias para manque defina a PAGERvariável como um script de wrapper que defina 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/bashna primeira linha e você pode usar a #'\e'sintaxe para obter um caractere de escape. Nos sistemas em que o /bin/shtraço /bin/shé usado, o uso é um pouco mais rápido, embora possa não ser perceptível na prática.)

Chame esse script less-colore adicione alias man='PAGER=less-color man'ao seu ~/.bashrcou ~/.zshrc. Em alguns sistemas, em vez de criar um alias, você pode dizer manpara usar um pager diferente configurando a MANPAGERvariável de ambiente: export MANPAGER=less-colorno seu ~/.profile.

Gilles 'SO- parar de ser mau'
fonte
1

Suponho que você tenha definido erroneamente os valores dessas variáveis ​​LESS_ * para cadeias que contêm caracteres de escape reais, em oposição a cadeias 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.

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

offby1
fonte
Remover o cifrão atrapalha minhas páginas de manual. Por exemplo, man top= em \e[01;34mSYNOPSIS\e[00mvez de colorir a palavra "SINOPSE".
18713 Jeff Jeff
O cifrão não funcionou. Você consegue pensar em uma solução alternativa? Talvez uma maneira de restringir essas variáveis ​​MENOS seja usada apenas nas páginas de manual?
21813 Jeff Jeff
0

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

Deixe-me adicionar informações sobre o casal. LESS_TERMCAP_xxsubstituir recursos TERMCAP. Essa substituição é gerenciada por lesssi só screen.ce o valor é usado posteriormente posteriormente como se tivesse sido retornado pela biblioteca TERMCAP. Isso significa que deve ser uma sequência bruta de caracteres de controle.

Minha conta sobre como "consertar" isso é envolver- lessse

$ 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 "$@"
Miroslav Koškár
fonte
Engraçado, estou trabalhando nisso agora e está com uma boa aparência. Você tem uma versão que também funciona #!/bin/sh(que é dash, no meu caso)? Não consigo descobrir como inserir um ESCcaractere literal com o vim.
19413 Jeff
1
@ Jeff Apenas de cima da minha cabeça você sempre pode fazer algo assim export LESS_TERMCAP_me="$(printf '\e[0m')". Na verdade, se você olhar para a resposta do @Gilles, ele está reivindicando export LESS_TERMCAP_me=$escape'[0m'que /bin/shtambém deve funcionar .
Miroslav Koškár