我大部分时间都在 Unix 环境中工作并使用终端模拟器。我尝试在命令行上使用颜色,因为颜色使输出更加有用和直观。
有哪些选项可以为我的终端环境添加颜色?你用什么技巧?你遇到过哪些陷阱?
不幸的是,对颜色的支持因终端类型、操作系统、术语设置、实用程序、有缺陷的实现等而异。
经过大量实验后,以下是我的设置的一些提示:
- 我倾向于设置
TERM=xterm-color
,大多数主机(但不是全部)都支持它。 - 我使用过许多不同的主机、不同的操作系统版本等。我使用过 macOS X、Ubuntu Linux、RHEL/CentOS/Scientific Linux 和 FreeBSD 等所有操作系统。如果可能的话,我会尽量让事情保持简单和通用。
- 我使用 GNU 做了很多工作
screen
,这又增加了一层乐趣。 - 许多操作系统
dircolors
默认设置了诸如 和 之类的东西,我不想在一百个不同的主机上修改它。所以我尝试坚持使用默认值。相反,我调整了终端的颜色配置。 对某些部分使用颜色Unix命令(
ls
,grep
,less
,vim
) 和bash 提示符。这些命令似乎使用标准“ANSI 转义序列“。 例如:alias less='less --RAW-CONTROL-CHARS' export LS_OPTS='--color=auto' alias ls='ls ${LS_OPTS}'
我将发布.bashrc
并回答我自己的问题 Jeopardy Style。
答案1
您可以执行以下几项操作:
编辑+代码
许多编辑器都支持语法突出显示。vim
并emacs
默认启用它。你也可以在下面启用它nano
。
您还可以使用以下命令在终端上语法突出显示代码皮格门斯作为命令行工具。
grep
grep --color=auto
突出显示所有比赛。您还可以使用它export GREP_OPTIONS='--color=auto'
来使其持久化而无需别名。如果你使用的话--color=always
,它会即使在管道时也使用颜色,这让事情变得混乱。
LS
ls --color=always
颜色指定:
export LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33'
(提示:dircolors
可能有帮助)
PS1
您可以将 PS1(shell 提示符)设置为使用颜色。例如:
PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '
将产生如下 PS1:
[黄色]lucas@ubuntu: [红色]~[正常]$
你可以通过这个发挥真正的创意。作为一个想法:
PS1='\e[s\e[0;0H\e[1;33m\h \t\n\e[1;32mThis is my computer\e[u[\u@\h: \w]\$ '
在终端顶部放置一个栏,其中包含一些随机信息。 (为了获得最佳结果,还可以使用alias clear="echo -e '\e[2J\n\n'"
。)
摆脱转义序列
如果某些东西在您不希望的情况下卡住输出颜色,我使用此sed
行来删除转义序列:
sed "s/\[^[[0-9;]*[a-zA-Z]//gi"
如果您想要更真实的体验,您还可以删除以 开头的行\e[8m
,它指示终端隐藏文本。 (未得到广泛支持。)
sed "s/^\[^[8m.*$//gi"
另请注意,这些 ^[ 应该是实际的、文字的 ^[ 。您可以通过在 bash 中按 ^V^[ 来输入它们,即Ctrl+ V, Ctrl+ [。
答案2
我也用:
export TERM=xterm-color
export GREP_OPTIONS='--color=auto' GREP_COLOR='1;32'
export CLICOLOR=1
export LSCOLORS=ExFxCxDxBxegedabagacad
如果您喜欢对提示进行着色,定义的颜色变量可能会很有用:
export COLOR_NC='\e[0m' # No Color
export COLOR_BLACK='\e[0;30m'
export COLOR_GRAY='\e[1;30m'
export COLOR_RED='\e[0;31m'
export COLOR_LIGHT_RED='\e[1;31m'
export COLOR_GREEN='\e[0;32m'
export COLOR_LIGHT_GREEN='\e[1;32m'
export COLOR_BROWN='\e[0;33m'
export COLOR_YELLOW='\e[1;33m'
export COLOR_BLUE='\e[0;34m'
export COLOR_LIGHT_BLUE='\e[1;34m'
export COLOR_PURPLE='\e[0;35m'
export COLOR_LIGHT_PURPLE='\e[1;35m'
export COLOR_CYAN='\e[0;36m'
export COLOR_LIGHT_CYAN='\e[1;36m'
export COLOR_LIGHT_GRAY='\e[0;37m'
export COLOR_WHITE='\e[1;37m'
然后我的提示是这样的:
case $TERM in
xterm*|rxvt*)
local TITLEBAR='\[\033]0;\u ${NEW_PWD}\007\]'
;;
*)
local TITLEBAR=""
;;
esac
local UC=$COLOR_WHITE # user's color
[ $UID -eq "0" ] && UC=$COLOR_RED # root's color
PS1="$TITLEBAR\n\[${UC}\]\u \[${COLOR_LIGHT_BLUE}\]\${PWD} \[${COLOR_BLACK}\]\$(vcprompt) \n\[${COLOR_LIGHT_GREEN}\]→\[${COLOR_NC}\] "
$(vcprompt) 正在我的 ~/sbin 中调用 python 脚本,该脚本打印有关当前路径的版本控制信息。它包括对 Mercurial、Git、Svn、Cvs 等的支持。脚本的作者有来源在这里。
这是完整源码我的提示配置:
答案3
grep
并且ls
已经提到过,如果您想要更多颜色,请查看通用着色器,其最初的目的是为日志文件着色,但开箱即用,它也为ping
, traceroute
, gcc
, make
, netstat
, diff
, last
, ldap
, 和着色cvs
。
如果您了解正则表达式,它很容易扩展。我已将ps
和添加nmap
到列表中(如果您加入,grc
我将非常乐意分享这两个工具的 .conf 文件)
synaptic
(顺便说一句,要通过、等方式安装它,pacman
您可能会更幸运地搜索“grc”)
答案4
颜色为手册页(更多详情):
function _colorman() {
env \
LESS_TERMCAP_mb=$'\e[1;35m' \
LESS_TERMCAP_md=$'\e[1;34m' \
LESS_TERMCAP_me=$'\e[0m' \
LESS_TERMCAP_se=$'\e[0m' \
LESS_TERMCAP_so=$'\e[7;40m' \
LESS_TERMCAP_ue=$'\e[0m' \
LESS_TERMCAP_us=$'\e[1;33m' \
LESS_TERMCAP_mr=$(tput rev) \
LESS_TERMCAP_mh=$(tput dim) \
LESS_TERMCAP_ZN=$(tput ssubm) \
LESS_TERMCAP_ZV=$(tput rsubm) \
LESS_TERMCAP_ZO=$(tput ssupm) \
LESS_TERMCAP_ZW=$(tput rsupm) \
GROFF_NO_SGR=1 \
"$@"
}
alias man="LANG=C _colorman man"
function perldoc() { command perldoc -n less "$@" |man -l -; }
颜色为grep(1;32
是亮绿色,其他颜色请参阅此处的其他帖子):
GREP_OPTS='--color=auto' # for aliases since $GREP_OPTIONS is deprecated
GREP_COLOR='1;32' # (legacy) bright green rather than default red
# (new) Matching text in Selected line = green, line numbers dark yellow
GREP_COLORS="ms=${GREP_COLOR}:mc=${GREP_COLOR}:ln=33"
alias grep='grep $GREP_OPTS'
alias egrep='grep -E $GREP_OPTS'
alias fgrep='LC_ALL=C grep -F $GREP_OPTS'
使用LC_ALL=C
fgrep 可以提供性能提升 140 倍
更多颜色GNU 语言:
# use the config at ~/.dircolors if it exists, otherwise generate anew
eval "$( dircolors --sh $(find ~/.dircolors -size +0 2>/dev/null) )"
# Usage: _ls_colors_add BASE NEW [NEW...]
# Have LS color given NEW extensions the way BASE extension is colored
_ls_colors_add() {
local BASE_COLOR="${LS_COLORS##*:?.$1=}" NEW
if [ "$LS_COLORS" != "$BASE_COLOR" ]; then
BASE_COLOR="${BASE_COLOR%%:*}"
shift
for NEW in "$@"; do
if [ "$LS_COLORS" = "${LS_COLORS#*.$NEW=}" ]; then
LS_COLORS="${LS_COLORS%%:}:*.$NEW=$BASE_COLOR:"
fi
done
fi
export LS_COLORS
}
_ls_colors_add zip jar xpi # archives
_ls_colors_add jpg ico JPG PNG webp # images
_ls_colors_add ogg opus # audio (opus now included by default)
export CLICOLOR=1 # BSD auto-color trigger (like ls -G but for everything)
if ls -ld --color=auto / >/dev/null 2>&1
then alias ls="ls -ph --color=auto"
else alias ls="ls -ph"
fi
安装grc
(通用着色剂) 并将其添加到您的别名中:
if type grc grcat >/dev/null 2>&1; then
colourify() { # using this as a function allows easier calling down lower
if [[ -t 1 || -n "$CLICOLOR_FORCE" ]]
then ${GRC:-grc} -es --colour=auto "$@"
else "$@"
fi
}
# loop through known commands plus all those with named conf files
for cmd in g++ head ld ping6 tail traceroute6 `locate grc/conf.`; do
cmd="${cmd##*grc/conf.}" # we want just the command
type "$cmd" >/dev/null 2>&1 && alias "$cmd"="colourify $cmd"
done
# This needs run-time detection. We even fake the 'command not found' error.
configure() {
if [[ -x ./configure ]]; then
colourify ./configure "$@"
else
echo "configure: command not found" >&2
return 127
fi
}
unalias ll 2>/dev/null
ll() {
if [[ -n "$CLICOLOR_FORCE" || -t 1 ]]; then # re-implement --color=auto
ls -l --color=always "$@" |grcat conf.ls
return ${PIPESTATUS[0]} ${pipestatus[1]} # exit code of ls via bash or zsh
fi
ls -l "$@"
}
fi
颜色为差异:函数内容太多,请使用脚本并在 rc 文件中为其指定别名(如果安装了则不需要grc
):
#!/usr/bin/perl
use strict;
use warnings;
open (DIFF, "-|", "diff", @ARGV) or die $!;
my $ydiff = 1;
while (<DIFF>) {
if (not -t 1) {
print;
next;
}
chomp;
$ydiff = 0 if /^[ <>\@+-]/ or ($. == 1 && /^\d+[a-z]{1,5}\d+$/);
my $color = "";
if (! $ydiff && /^[\@+-<>]/) {
$color = (/^[<-](?!--$)/ ? 1 : /^[+>]/ ? 2 : 5);
} elsif ($ydiff && /\t {6}([<|>])(?:\t|$)/) {
$color = ($1 eq "<" ? 1 : $1 eq ">" ? 2 : 4);
}
$color ? printf ("\e[1;3%dm%s\e[0;0m\n",$color,$_) : print "$_\n";
}
close DIFF;
颜色为bash 提示符:
# Shorten home dir, Cygwin drives, paths that are too long
function PSWD() {
local p="$*" space A B cols="${COLUMNS:-`tput cols 2>/dev/null || echo 80`}"
p="${p/$HOME/\~}" # shrink home down to a tilde
if [ -d /cygdrive ] && [ "${p#/cygdrive/?/}" != "$p" ]; then
p="${p:10:1}:${p:11}" # /cygdrive/c/hi -> c:/hi
fi
space="$((${#USER}+${#HOSTNAME}+6))" # width w/out the path
if [ "$cols" -lt 60 ]; then echo -n "$N "; space=-29; p="$p$N\b"; fi
if [ "$cols" -lt "$((space+${#p}+20))" ]; then # < 20 chars for the command
A=$(( (cols-20-space)/4 )) # a quarter of the space (-20 for cmd)
if [ $A -lt 4 ]; then A=4; fi # 4+ chars from beginning
B=$(( cols-20-space-A*2 )) # half (plus rounding) of the space
if [ $B -lt 8 ]; then B=8; fi # 8+ chars from end
p="${p:0:$A}..${p: -$B}"
fi
echo "$p"
}
PSC() { printf $'\[\e[%sm\]' "${*:-0;0}"; }
PR="0;32" # default color used in prompt is green
if [ "$(id -u)" = 0 ]; then
sudo=41 # root is red background
elif [ "$USER" != "${SUDO_USER:-$USER}" ]; then
sudo=31 # not root, not self: red text
else sudo="$PR" # standard user color
fi
PROMPT_COMMAND='[ $? = 0 ] && PS1=${PS1[1]} || PS1=${PS1[2]}'
PSbase="$(PSC $sudo)\u$(PSC $PR)@\h $(PSC 33)\$(PSWD \w)"
PS1[1]="$PSbase$(PSC $PR)\$ $(PSC)"
PS1[2]="$PSbase$(PSC 31)\$ $(PSC)"
PS1="${PS1[1]}"
unset sudo PR PSbase