いくつかのコマンドで予期しないカラー化された出力を取得する


8

これを自分.bashrcに追加して、カラー化された出力を取得します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'

...そして今、突然の特定のコマンド(環境変数の表示に関連しているようです)はすべて、これらの新しい設定に一致するカラー出力を生成します。私は間違ってエスケープしていますか?それともこの意図的な行動ですか?他のエスケープバリエーションをいくつか試しましたが、では機能しませんでしたless

たとえば、これはenvコマンドのスクリーンショットです。

envコマンド

php -i 出力も色分けされていますが、環境変数セクションのみです。

php -iコマンド

回答:


4

これは正常な動作です。これらの環境変数には、端末の前景色を変更させるエスケープシーケンスが含まれています。それらの出力任意のプログラムは、それを可能するときは、同じ視覚効果を得ますlessenv

これらの変数には実際のエスケープ文字が含まれている必要があり、以下の変数は後処理を行いません。

通常、lesskeyファイルに格納できる構成変数の数は少なくなりますが、lessはlesskeyファイルをLESS_TERMCAP_xx読み取る前にそれらを読み取るため、変数に対しては機能しません(less 444以降)。だから、環境に置くしかありません。

これらの変数をのman他の用途にのみ適用し、他の用途には適用しないless場合は、のエイリアスを使用しmanて、PAGER変数を環境変数を設定するラッパースクリプトに設定できます。

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

exec less "$@"

(または、#!/bin/bash最初の行でを使用すると、#'\e'構文を使用してエスケープ文字を取得できます/bin/sh。isがダッシュのシステムでは/bin/sh、実際には目立たないかもしれませんが、使用する方がわずかに高速です。)

このスクリプトを呼び出して、またはにless-color追加alias man='PAGER=less-color man'します。一部のシステムでは、エイリアスを作成する代わりに、環境変数を設定することにより、別のポケットベルを使用するように指示できます。~/.bashrc~/.zshrcmanMANPAGERexport MANPAGER=less-color~/.profile


1

これらのLESS_ *変数の値を、バックスラッシュとそれに続くeを含む文字列とは対照的に、実際のエスケープ文字を含む文字列に誤って設定したと思います。したがって、これらの値を表示するたびに、端末の色が変わります。

.bashrcで行った設定を注意深く調べ、それらが正しいことを確認します。私はあなたがする必要があるのはドル記号を取り除くことだけだと思います。


ドル記号を削除すると、私のマニュアルページがめちゃくちゃになります。たとえば、「SYNOPSIS」という単語に色を付ける代わりにman top=を\e[01;34mSYNOPSIS\e[00m使用します。
ジェフ

ドル記号は機能しませんでした。回避策は考えられますか?たぶん、それらのLESS変数をmanページでのみ使用するように制限する方法はありますか?
ジェフ

0

@Gillesが彼の回答で指摘しているように、これは予想される動作です。

カップル情報を追加します。 LESS_TERMCAP_xxTERMCAP機能をオーバーライドします。このオーバーライドはlessそれ自体で管理されscreen.c、値はTERMCAPライブラリーによって返されたかのように後で使用されます。つまり、制御文字の生のシーケンスでなければなりません。

これを「修正」する方法に関する私のアカウントは、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 "$@"

おかしい、私は今これに取り組んでおり、見栄えが良い。動作するバージョン#!/bin/sh(私の場合はダッシュ)はありますか?ESCvimでリテラル文字を挿入する方法がわかりません。
ジェフ

1
@Jeff頭のてっぺんからいつでも次のようなことができますexport LESS_TERMCAP_me="$(printf '\e[0m')"。実際、@ Gillesの回答を見ると、彼も協力export LESS_TERMCAP_me=$escape'[0m'すべきだと主張してい/bin/shます。
MiroslavKoškár2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.