Erhalten einer unerwarteten kolorierten Ausgabe bei mehreren Befehlen

8

Ich habe dies gerade zu meiner hinzugefügt .bashrc, um eine kolorierte Ausgabe zu erhalten mit 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'

... und jetzt erzeugen plötzlich bestimmte Befehle (die mit der Anzeige von Umgebungsvariablen zusammenhängen) eine Farbausgabe, die diesen neuen Einstellungen entspricht. Entkomme ich falsch? Oder ist das absichtliches Verhalten? Ich habe ein paar andere Fluchtvarianten ausprobiert, aber sie haben nicht funktioniert less.

Hier ist zum Beispiel ein Screenshot eines envBefehls.

Befehl env

php -i hat auch kolorierte Ausgabe, aber nur im Abschnitt Umgebungsvariablen.

Befehl php -i

Jeff
quelle

Antworten:

4

Dies ist normales Verhalten. Diese Umgebungsvariablen enthalten Escape-Sequenzen, die bewirken, dass das Terminal seine Vordergrundfarbe ändert. Sie erhalten den gleichen visuellen Effekt, wenn ein Programm sie ausgibt, sei es lessoder env.

Diese Variablen müssen die tatsächlichen Escape-Zeichen enthalten, weniger werden nicht nachbearbeitet.

Normalerweise können Sie weniger Konfigurationsvariablen in Ihre Lesskey-Datei einfügen , dies funktioniert jedoch nicht für die LESS_TERMCAP_xxVariablen, da sie weniger gelesen werden, bevor die Lesskey-Datei gelesen wird (ab weniger 444). Sie haben also keine andere Wahl, als sie in die Umwelt zu stellen.

Wenn Sie möchten, dass diese Variablen nur für manund nicht für andere Verwendungen von gelten less, können Sie einen Alias ​​verwenden man, der die PAGERVariable auf ein Wrapper-Skript setzt, das die Umgebungsvariablen festlegt.

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

exec less "$@"

(Alternativ können Sie #!/bin/bashin der ersten Zeile auch die #'\e'Syntax verwenden, um ein Escapezeichen zu erhalten. Auf Systemen mit /bin/shStrich ist die Verwendung /bin/shetwas schneller, obwohl sie in der Praxis möglicherweise nicht erkennbar ist.)

Rufen Sie dieses Skript auf less-colorund fügen Sie alias man='PAGER=less-color man'es Ihrem ~/.bashrcoder hinzu ~/.zshrc. Auf einigen Systemen können Sie anstelle eines Alias ​​festlegen man, dass ein anderer Pager verwendet werden soll, indem Sie die MANPAGERUmgebungsvariable festlegen: export MANPAGER=less-colorin Ihrem ~/.profile.

Gilles 'SO - hör auf böse zu sein'
quelle
1

Ich gehe davon aus, dass Sie die Werte dieser LESS_ * -Variablen fälschlicherweise auf Zeichenfolgen gesetzt haben, die tatsächliche Escape-Zeichen enthalten, im Gegensatz zu Zeichenfolgen, die einen Backslash gefolgt von einem e enthalten. Jedes Mal, wenn Sie diese Werte anzeigen, ändern sie die Farbe Ihres Terminals.

Ich würde mir die Einstellungen, die Sie in Ihrem .bashrc vorgenommen haben, sehr genau ansehen und sicherstellen, dass sie korrekt sind. Ich vermute, dass Sie nur das Dollarzeichen entfernen müssen.

offby1
quelle
Das Entfernen des Dollarzeichens bringt meine Manpages durcheinander. Zum Beispiel man top= \e[01;34mSYNOPSIS\e[00manstatt das Wort "SYNOPSIS" einzufärben.
Jeff
Das Dollarzeichen funktionierte nicht. Können Sie sich eine Problemumgehung vorstellen? Vielleicht eine Möglichkeit, diese WENIGER Variablen so einzuschränken, dass sie nur auf Manpages verwendet werden?
Jeff
0

Wie @Gilles in seiner Antwort hervorhebt, ist dies ein erwartetes Verhalten.

Lassen Sie mich nur ein paar Infos hinzufügen. LESS_TERMCAP_xxTERMCAP-Funktionen überschreiben. Dieses Überschreiben wird von lessselbst verwaltet screen.cund der Wert wird erst später verwendet, als ob er von der TERMCAP-Bibliothek zurückgegeben worden wäre. Das heißt, es muss eine rohe Folge von Steuerzeichen sein.

Mein Konto, wie man dies "repariert", ist, sich lessselbst einzuwickeln

$ 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
quelle
Komisch, ich arbeite gerade daran und es sieht gut aus. Haben Sie eine Version, die auch funktioniert #!/bin/sh(was in meinem Fall Bindestrich ist)? Ich kann nicht herausfinden, wie man ESCmit vim ein wörtliches Zeichen einfügt.
Jeff
1
@ Jeff Nur von oben kannst du immer so etwas machen export LESS_TERMCAP_me="$(printf '\e[0m')". Wenn Sie sich die Antwort von @Gilles ansehen, behauptet er, dass er auch damit arbeiten export LESS_TERMCAP_me=$escape'[0m'sollte /bin/sh.
Miroslav Koškár