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

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

我刚刚将其添加到我的中.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命令的屏幕截图。

环境命令

php -i也有彩色输出,但仅限于环境变量部分。

php -i 命令

答案1

这是正常行为。这些环境变量包含导致终端更改其前景色的转义序列。当任何程序输出它们时,无论是 itless还是env.

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

通常你可以在你的程序中放置更少的配置变量少密钥文件,但这对变量不起作用LESS_TERMCAP_xx,因为 less 在读取 lesskey 文件之前读取它们(从 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破折号的系统上,使用/bin/sh速度稍快,尽管在实践中可能并不明显。)

调用此脚本less-color,并将其添加alias man='PAGER=less-color man'到您的~/.bashrc~/.zshrc.在某些系统上,您可以man通过设置环境变量来指示使用不同的分页器,而不是创建别名MANPAGERexport MANPAGER=less-color在您的~/.profile.

答案2

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

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

答案3

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

相关内容