在几个命令上获得意外的彩色输出


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命令

Answers:


4

这是正常现象。这些环境变量包含会导致终端更改其前景色的转义序列。你得到相同的视觉效果,当任何程序输出的他们,无论是lessenv

这些变量需要包含实际的转义字符,较少对它们不做任何后处理。

通常,您可以在lesskey文件中放入较少的配置变量,但这对LESS_TERMCAP_xx变量不起作用,因为在读取lesskey文件之前,less会先读取它们(从444起)。因此,您别无选择,只能将它们放入环境中。

如果您希望这些变量仅应用于man,而不应用于less,则可以使用别名来manPAGER变量设置为设置环境变量的包装脚本。

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

exec less "$@"

(或者,#!/bin/bash在第一行使用,您可以使用#'\e'语法获取转义符。在/bin/sh破折号的系统上,使用/bin/sh速度稍快,尽管在实践中可能并不明显。)

调用此脚本less-color,然后添加alias man='PAGER=less-color man'到您的~/.bashrc或中~/.zshrc。在某些系统上,而不是创建一个别名,你可以告诉man通过设置使用不同的寻呼机MANPAGER环境变量:export MANPAGER=less-color在你的~/.profile


1

我假设您错误地将那些LESS_ *变量的值设置为包含实际转义符的字符串,而不是将其包含反斜杠后跟e的字符串。因此,每次显示这些值时,它们都会更改终端的颜色。

我会非常仔细地查看您在.bashrc中所做的设置,并确保它们是正确的。我怀疑您需要做的就是消除美元符号。


删除美元符号会弄乱我的手册页。例如,man top= \e[01;34mSYNOPSIS\e[00m而不是给单词“ SYNOPSIS”上色。
杰夫

美元符号无效。您能想到一种解决方法吗?也许可以将那些LESS变量限制为仅在手册页上使用?
杰夫

0

正如@Gilles在他的回答中指出的那样,这是预期的行为。

我只添加几个信息。 LESS_TERMCAP_xx覆盖TERMCAP功能。此覆盖由其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(在我的情况下为破折号)?我不知道如何ESC用vim 插入文字字符。
杰夫,

1
@Jeff只要从我的头顶上就可以总是做类似的事情export LESS_TERMCAP_me="$(printf '\e[0m')"。实际上,如果您查看@Gilles的答案,他声称export LESS_TERMCAP_me=$escape'[0m'也可以使用/bin/sh
MiroslavKoškár2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.