Ottenere un output colorato inaspettato su diversi comandi


8

Ho appena aggiunto questo al mio .bashrcper ottenere un output colorato con 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 ora all'improvviso alcuni comandi (sembra essere correlato alla visualizzazione delle variabili di ambiente) producono un output di colore che corrisponde a queste nuove impostazioni. Sto scappando male? O è questo comportamento intenzionale? Ho provato alcune altre varianti di escape, ma non hanno funzionato less.

Ad esempio, ecco uno screenshot di un envcomando.

comando env

php -i ha anche un output colorato, ma solo nella sezione delle variabili d'ambiente.

comando php -i

Risposte:


4

Questo è un comportamento normale. Queste variabili di ambiente contengono sequenze di escape che fanno cambiare al colore di primo piano il terminale. Ottieni lo stesso effetto visivo quando un programma li emette, sia esso lesso env.

Queste variabili devono contenere i caratteri di escape effettivi, meno non eseguono alcun postelaborazione su di essi.

Normalmente puoi inserire meno variabili di configurazione nel tuo file lesskey , ma questo non funziona per le LESS_TERMCAP_xxvariabili, perché less le legge prima di leggere il file lesskey (a partire da meno 444). Quindi non hai altra scelta che metterli nell'ambiente.

Se si desidera che queste variabili si applichino solo mane non ad altri usi di less, è possibile utilizzare un alias per manimpostare la PAGERvariabile su uno script wrapper che imposta le variabili di ambiente.

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

exec less "$@"

(In alternativa, usa #!/bin/bashsulla prima riga e puoi usare la #'\e'sintassi per ottenere un carattere di escape. Sui sistemi in cui /bin/shè presente il trattino, l'utilizzo /bin/shè leggermente più veloce, anche se potrebbe non essere evidente nella pratica.)

Chiama questo script less-colore aggiungilo alias man='PAGER=less-color man'al tuo ~/.bashrco ~/.zshrc. Su alcuni sistemi, invece di creare un alias, puoi dire mandi usare un altro cercapersone impostando la MANPAGERvariabile d'ambiente: export MANPAGER=less-colornel tuo ~/.profile.


1

Suppongo che tu abbia erroneamente impostato i valori di quelle LESS_ * su stringhe che contengono caratteri di escape effettivi, al contrario di stringhe che contengono una barra rovesciata seguita da una e. Pertanto, ogni volta che visualizzi questi valori, cambiano il colore del tuo terminale.

Esaminerei con molta attenzione le impostazioni effettuate nel tuo .bashrc e assicurerei che siano corrette. Ho il sospetto che tutto ciò che devi fare è eliminare il simbolo del dollaro.


La rimozione del simbolo del dollaro rovina le mie pagine man. Ad esempio, man top= \e[01;34mSYNOPSIS\e[00minvece di colorare la parola "SINOSSI".
Jeff,

Il simbolo del dollaro non ha funzionato. Riesci a pensare a una soluzione alternativa? Forse un modo per limitare quelle MENO variabili da usare solo nelle pagine man?
Jeff,

0

Come sottolinea @Gilles nella sua risposta, si tratta di un comportamento previsto.

Vorrei solo aggiungere informazioni sulla coppia. LESS_TERMCAP_xxsovrascrivere le funzionalità TERMCAP. Questa sostituzione viene gestita da lesssola in screen.ce il valore viene usato in seguito come se fosse stato restituito dalla libreria TERMCAP. Ciò significa che deve essere una sequenza non elaborata di caratteri di controllo.

Il mio conto su come "correzione" è quello di avvolgere less

$ 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 "$@"

Divertente, ci sto lavorando proprio ora e sta bene. Hai una versione che funziona anche con #!/bin/sh(che è trattino, nel mio caso)? Non riesco a capire come inserire un ESCpersonaggio letterale con vim.
Jeff,

1
@Jeff Solo dalla cima della mia testa puoi sempre fare qualcosa del genere export LESS_TERMCAP_me="$(printf '\e[0m')". In realtà se guardi la risposta di @Gilles, sta sostenendo che export LESS_TERMCAP_me=$escape'[0m'dovrebbe funzionare /bin/shanche con .
Miroslav Koškár,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.