为终端和外壳环境着色?


262

我大部分时间都在Unix环境中工作,并使用终端仿真器。我尝试在命令行上使用color,因为color使输出更加有用和直观。

有哪些选项可为终端环境添加颜色?您使用什么技巧?您遇到了什么陷阱?

不幸的是,对颜色的支持因终端类型,操作系统,TERM设置,实用程序,错误的实现等而异。

经过大量实验,以下是我设置中的一些提示:

  1. 我倾向于设置TERM=xterm-color,大多数主机(但不是全部)都支持。
  2. 我在许多不同的主机,不同的OS版本等上工作。我使用macOS X,Ubuntu Linux,RHEL / CentOS / Scientific Linux和FreeBSD中的所有内容。如果可能的话,我试图使事情变得简单而通用。
  3. 我使用GNU进行了大量工作screen,这又增加了一层乐趣。
  4. 许多操作系统dircolors在默认情况下会设置和,并且我不想在一百台不同的主机上进行修改。因此,我尝试使用默认值。相反,我调整了终端的颜色配置。
  5. 对于一些使用颜色Unix命令lsgreplessvim)和Bash提示符。这些命令似乎使用标准的“ ANSI转义序列 ”。例如:

    alias less='less --RAW-CONTROL-CHARS'
    export LS_OPTS='--color=auto'
    alias ls='ls ${LS_OPTS}'
    

我将发布帖子.bashrc并回答我自己的问题《危险风格》。


我的方法(请参见下面的答案)解决了OSX和Linux差异的问题,例如,一个颜色是ls -G,另一个颜色是ls --color-auto
Michael Durrant 2015年

1
有人看到过为列着色的工具吗?那是一个column -t --color
托马什Pospíšek

Answers:


121

您可以执行以下几项操作:

编辑器+代码
许多编辑器都具有语法突出显示支持。vimemacs默认启用它。您也可以在下启用它nano

您也可以通过使用Pygments作为命令行工具在终端上语法突出显示代码。

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"

另请注意,这些^ [s应该是实际的文字^ [s。您可以通过按bash中的^ V ^ [来键入它们,即Ctrl+ VCtrl+ [


1
PS1的第一行应显示为:PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '。第四个反斜杠后有多余的x。
克里斯,

3
转义符应包含在其中\[...\],否则第二行中的命令将覆盖第一行。PS1 ='[\ e [33; 1m] \ u @ \ h:[\ e [31m] \ W \ e [0m \ $'
yanglifu90

ls --color=always不起作用。@Michael Durrant的方法对此更好:ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
Simon C.

83

我还使用:

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_WHITE='\e[1;37m'
export COLOR_BLACK='\e[0;30m'
export COLOR_BLUE='\e[0;34m'
export COLOR_LIGHT_BLUE='\e[1;34m'
export COLOR_GREEN='\e[0;32m'
export COLOR_LIGHT_GREEN='\e[1;32m'
export COLOR_CYAN='\e[0;36m'
export COLOR_LIGHT_CYAN='\e[1;36m'
export COLOR_RED='\e[0;31m'
export COLOR_LIGHT_RED='\e[1;31m'
export COLOR_PURPLE='\e[0;35m'
export COLOR_LIGHT_PURPLE='\e[1;35m'
export COLOR_BROWN='\e[0;33m'
export COLOR_YELLOW='\e[1;33m'
export COLOR_GRAY='\e[0;30m'
export COLOR_LIGHT_GRAY='\e[0;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等的支持。脚本的作者在此处提供了源代码

重击提示屏幕截图

这是我的提示配置的完整来源


看到这里解决线路问题,当我使用上述PS1我:stackoverflow.com/questions/5087036/...
Xander的邓恩

我已经更新了答案,以反映提示中颜色的转义括号。谢谢!
克里斯(Kris)2014年

1
$LSCOLORS并且$CLICOLOR用于BSD ls。GNU ls(Linux)使用$LS_COLORS不同的语法。因为GNU对我来说就像家一样,所以我LSCOLORS=exgxfxDacxBaBaCaCaeaEa习惯在BSD上模仿GNU的颜色。
亚当·卡兹

grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
史蒂文·阿尔默罗斯

1
您可能需要获取.bashrc文件,以使修改生效。您可以使用以下命令进行操作。 source /path/to/.bashrc
弗朗索瓦

18

grepls已经提到,如果你想有更多颜色看看通用Coloriser,其最初目的是上色的日志文件,但开箱它也colorizes pingtraceroutegccmakenetstatdifflastldap,和cvs

如果您知道正则表达式,它很容易扩展。我已经添加psnmap到列表中(如果你进入grc我会比高兴更多分享conf文件为这两个工具)

(顺便说一句,通过安装synapticpacman和一样,你可能有更好的运气搜索“GRC”)


grc现在ps默认支持。我会对你的nmap色素感兴趣。另请参阅我的答案,以在升级grc时吸收所有新命令的方式对所有这些进行别名。
亚当·卡兹

我注意到了。这是我的conf.nmap(以及其他所有东西,真的)gist.github.com/sygo/844982#file-conf-nmap-我注意到您在infosec中工作,您可能会发现conf.hexdump很有趣,但我还没有完成虽然。
Sygo 2015年

谢谢@Sygo。我已经分叉并修改了您的要点。我从未真正使用git提交过数据(更不用说github的要点了),而且我不知道如何建议将其合并回您(我猜这是因为要点太简单了)。
亚当·卡兹

我怀疑您不能,因为这是要点,而不是适当的存储库。我确实检查了您的叉子,并且肯定会试一试您的版本。我很好奇那个十六进制的垃圾堆将变成...
Sygo

11

多年来,我一直在磨练.bashrc使其可以在OSX和Ubuntu上使用。
我还使用紧凑的条件语句将其大小减小到28行。
有了它,我的PS1提示符看起来像: 在此处输入图片说明

时间为红色,用户名为绿色,机器名称为浅蓝色,pwd为深蓝色,git分支为黄色。

我的PS1提示功能:

  • 显示git分支!
  • 长的目录路径(超过6个元素)被“修剪”以显示前3个和后3个_之间的目录(这pwd sed是LOCATION 的一部分)。
  • 最后回车,这样提示总是在左边!

.bashrc文件中的相关行是:

git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'; }
HOST='\033[02;36m\]\h'; HOST=' '$HOST
TIME='\033[01;31m\]\t \033[01;32m\]'
LOCATION=' \033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH
PS2='\[\033[01;36m\]>'

对于ls可用时带有颜色,而在没有时则没有错误(即OSX):

ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'

1
颜色可以ls在OS X上使用,但可以使用完成export CLICOLOR=1
ThomasW

3
@ThomasW,但不是在Linux上:-p这个家伙同时使用。
吉米·凯恩

1
尽管如此,ThomasW是正确的指出答案是错误的,因为它说颜色ls在MacOS 10上不可用。答案也是错误的,因为这里的提示字符串实际上是错误的。他们不正确的平衡\[\],以及造成的问题,至少一个人复制这个答案
JdeBP '16

9

手册页的颜色(更多详细信息):

function _colorman() {
  env \
    LESS_TERMCAP_mb=$(printf "\e[1;35m") \
    LESS_TERMCAP_md=$(printf "\e[1;34m") \
    LESS_TERMCAP_me=$(printf "\e[0m") \
    LESS_TERMCAP_se=$(printf "\e[0m") \
    LESS_TERMCAP_so=$(printf "\e[7;40m") \
    LESS_TERMCAP_ue=$(printf "\e[0m") \
    LESS_TERMCAP_us=$(printf "\e[1;33m") \
      "$@"
}
function man() { _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
GREP_COLORS="ms=$GREP_COLOR"  # (new) Matching text in Selected line = green
alias   grep='grep $GREP_OPTS'
alias egrep='egrep $GREP_OPTS'
alias fgrep='fgrep $GREP_OPTS'

GNU ls的更多颜色:

# use the config at ~/.dircolors if it exists, otherwise generate anew
eval "$( dircolors --sh $(ls -d ~/.dircolors 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)

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

安装grcGeneric Colouriser)并将其添加到您的别名中:

# using this as a variable allows easier calling down lower
export GRC='grc -es --colour=auto'

# 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
  # if the command exists, alias it to pass through grc
  type "$cmd" >/dev/null 2>&1 && alias "$cmd"="$GRC $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
}

# GRC plus LS awesomeness (assumes you have an alias for ls)
unalias ll 2>/dev/null
if ls -ld --color=always / >/dev/null 2>&1; then GNU_LS="--color=always"; fi

ll() {
  if [[ -t 1 ]] || [[ -n "$CLICOLOR_FORCE" ]]
    then colourify ls -l $GNU_LS "$@"
    else ls -l "$@"
  fi
}

diff的颜色:函数的内容太多,请使用脚本并将其命名为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
if [ -d /cygdrive ] && uname -a |grep -qi cygwin; then CYGWIN_OS=1; fi
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 [ -n "$CYGWIN_OS" ] && [ "${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() { echo -ne "\[\033[${1:-0;38}m\]"; }
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

bash提示演示


1
给予好评的截图
格林

我的PSWD()函数曾经与POSIX兼容,但是使用bash / zsh子字符串处理使它变得更加容易。请参阅POSIX版本的修订版6,该版本涉及很多问号,并且根本无法适应终端宽度。我没有更新屏幕截图,但是在80个字符的宽度上只是一个很小的变化。
亚当·卡兹

CLICOLOR=1在FREEBSD 11.2上对我不起作用
Simon C.

1
@SimonC。–您可能在FreeBSD系统上而不是BSD上使用GNU实用程序。CLICOLOR=1 ls应该与ls -G使用BSD 相同(ls -g在较旧的BSD上)。如果ls --color可行(没有错误),则说明您使用的是GNU ls命令,将$CLICOLOR被忽略。
亚当·卡兹

1
@SimonC。–您必须实际加载~/.bashrc才能使所有更改生效。运行source ~/.bashrc或启动新的bash会话(启动终端或运行bash)。
亚当·卡兹

8

设置粗体/彩色提示。来自cyberciti.bizBashFAQ

# 'tput bold' will work regardless of the foreground and background colors.
# Place the tput output into variables, so they are only execd once.
bold=$(tput bold) # This could also be a color.
reset=$(tput sgr0)
export PS1="\u@\[$bold\]\h\[$reset\]:\w \$ "

我还设法找到了广泛支持的颜色设置,并且这些颜色设置在较旧的环境(甚至是FreeBSD4!)中也不会打印出gobbledygook字符,并且如果TERM = vt100,xterm,xterm-color似乎可以正常工作。(大部分情况下)。从我的.bashrc中:

# Set some options, based on the OS
OS=`uname -s` 

case "$OS" in
    "SunOS" ) 
        # Solaris ls doesn't allow color, so use special characters
        LS_OPTS='-F'
        alias  ls='ls ${LS_OPTS}'
        ;;
    "Linux" )
        # GNU ls supports colors!
        # See dircolors to customize colors
        export LS_OPTS='--color=auto' 
        alias  ls='ls ${LS_OPTS}'

        # Get color support for 'less'
        export LESS="--RAW-CONTROL-CHARS"

        # Use colors for less, man, etc.
        [[ -f ~/.LESS_TERMCAP ]] && . ~/.LESS_TERMCAP

        export GREP_OPTIONS="--color=auto"

        ;;
    "Darwin"|"FreeBSD")

        # Most FreeBSD & Apple Darwin supports colors
        export CLICOLOR=true
        # Get color support for 'less'
        export LESS="--RAW-CONTROL-CHARS"

        # Use colors for less, man, etc.
        [[ -f ~/.LESS_TERMCAP ]] && . ~/.LESS_TERMCAP

        export GREP_OPTIONS="--color=auto"
        ;;
    * ) 
        echo "Unknown OS [$OS]"
        ;;
esac

1
或者,如果您想使用ZSH,aperiodic.net / phil / prompt上的Phil Gold提示是一件艺术品。
tsvallender


5

这里还没有说的话:

为了用gcc为编译输出着色,JohannesSchlüter提供了colorgcc

为了给原木着色,有多尾

为了给任何标准输出着色,我将xcol放在一起

xcol示例

我个人从xcol工具使用这些。

#normal=$(tput sgr0)                      # normal text
normal=$'\e[0m'                           # (works better sometimes)
bold=$(tput bold)                         # make colors bold/bright
red="$bold$(tput setaf 1)"                # bright red text
green=$(tput setaf 2)                     # dim green text
fawn=$(tput setaf 3); beige="$fawn"       # dark yellow text
yellow="$bold$fawn"                       # bright yellow text
darkblue=$(tput setaf 4)                  # dim blue text
blue="$bold$darkblue"                     # bright blue text
purple=$(tput setaf 5); magenta="$purple" # magenta text
pink="$bold$purple"                       # bright magenta text
darkcyan=$(tput setaf 6)                  # dim cyan text
cyan="$bold$darkcyan"                     # bright cyan text
gray=$(tput setaf 7)                      # dim white text
darkgray="$bold"$(tput setaf 0)           # bold black = dark gray text
white="$bold$gray"                        # bright white text

我像这样在脚本中使用这些变量

echo "${red}hello ${yellow}this is ${green}coloured${normal}"

我也喜欢这个小功能colorEcho(在Stack Overflow上找到)

function coloredEcho(){
    local exp=$1;
    local color=$2;
    if ! [[ $color =~ '^[0-9]$' ]] ; then
       case $(echo $color | tr '[:upper:]' '[:lower:]') in
        black) color=0 ;;
        red) color=1 ;;
        green) color=2 ;;
        yellow) color=3 ;;
        blue) color=4 ;;
        magenta) color=5 ;;
        cyan) color=6 ;;
        white|*) color=7 ;; # white or invalid color
       esac
    fi
    tput setaf $color;
    echo $exp;
    tput sgr0;
}

coloredEcho "This text is green" green

抱歉,不允许发布更多链接


2
您好,您如何制作提示路径的标志?我要说的是带有三角形末端的矩形棒谢谢
Artur Vieira

它也可以在ubuntu gnu终端上工作吗?
helle

lnav还是显示彩色日志文件的好工具
Cyril Chaboisseau

4

我建议您查看ZSH及其插件oh-my-zsh,它具有我所见过的最强大的控制台功能之一。其中之一是为您的终端选择主题。这是我主题的示例...在tty中,颜色不是很温暖,但是就像这张图片一样...任何方式您都会喜欢它!

在此处输入图片说明


2
如果可以的话,我会为Oh-My-ZSH的建议投反对票。作为在终端中广泛工作的系统工程师,以及试图将zsh / oh-my-zsh纳入我的工作流程的人,我可以坦白地说,我绝不会向任何人推荐ZSH。当然,您可以将zsh符号链接到以任何其他shell命名的文件并模拟该shell,但是这样做时,它不会读取您的.bashrc,.bash_profile等。此外,您也无法放入emulate bash.zprofile或.zshrc文件。对于使用BASH中的高级功能的任何人,都有许多细微之处会咬你。BASH是更好的选择。
查尔斯·亚迪斯

2
ZSH开箱即用的唯一优于BASH的东西是命令完成,但即使在BASH中也可以编程。也许除了偶尔执行平凡的任务之外不使用外壳的人应该采用ZSH,但不适用于需要广泛使用外壳的任何人。该=~运营商可以咬你,ZSH处理阵列可以咬你,等使用ZSH / OH-MY-ZSH约9个月,我受够了之后的方式。我使用的是我自己编写的自定义主题,将其移植到BASH并编写了自己的git提示行,而我再也没有回头。现在,我不再担心可移植性
Charles Addis

1
“它具有我所见过的最强大的控制台功能之一。其中之一就是为您的终端选择主题。”
乔纳森·哈特利

@JonathanHartley,您的评论似乎不完整。?
通配符

2
谢谢您的关注,但我的评论说了我想说的一切。
乔纳森·哈特利

4

要查看彩色的diff输出,请使用colordiff

sudo apt-get install colordiff

将任何差异格式输出通过管道传递到colordiff:

diff的输出通过管道传递到colordiff

这包括diff的一些替代格式,例如-y(并排)。

另外,如果独立调用(不带任何管道),则它充当“ diff”的包装,并为输出着色。因此,我在我的.bashrc中有此名称,以将'diff'别名为colordiff。

# if colordiff is installed, use it
if type colordiff &>/dev/null ; then
    alias diff=colordiff

1
.bashrc示例缺少final fi,可以将其转换为单行命令:type colordiff &> /dev/null && alias diff='colordiff'
Teemu Leisti

3

一些文本修饰(粗体)可轻松区分根外壳和非根外壳。对于Zsh:

if test $UID = 0
    then PS1="%B${PS1}%b "
fi

对于Bash:

if test $UID = 0
    then PS1="\033[1m${PS1}\033[0m"
fi

请指定您的外壳。该问题唯一的特定于shell的标记是bash,但我觉得您的代码不是bash
manatwork 2012年

@manatwork:对不起,忘了提到它是Zsh。更新了我的帖子。
Mischa Arefiev 2012年

3

我只是想知道同样的事情。我有自己的方法,但是我正在寻找替代方法。

我围绕程序调用编写bash包装器,并通过管道输出它们sed。我喜欢的sed是它将立即修改并回显每行=>没有太多缓冲。但是,我不喜欢每次对包装程序的调用都对sed代码进行解析和编译。

例如,这就是我要为输出的颜色着色ip

#
# Colorcodes
#
NORMAL=`echo -e '\033[0m'`
RED=`echo -e '\033[31m'`
GREEN=`echo -e '\033[0;32m'`
LGREEN=`echo -e '\033[1;32m'`
BLUE=`echo -e '\033[0;34m'`
LBLUE=`echo -e '\033[1;34m'`
YELLOW=`echo -e '\033[0;33m'`


#
# command: ip
# highlight ip addresses, default route and interface names
#

IP4=$GREEN
IP6=$LBLUE
IFACE=${YELLOW}
DEFAULT_ROUTE=$LBLUE

IP_CMD=$(which ip)

function colored_ip()
{
${IP_CMD} $@ | sed \
    -e "s/inet [^ ]\+ /${IP4}&${NORMAL}/g"\
    -e "s/inet6 [^ ]\+ /${IP6}&${NORMAL}/g"\
    -e "s/^default via .*$/${DEFAULT_ROUTE}&${NORMAL}/"\
    -e "s/^\([0-9]\+: \+\)\([^ \t]\+\)/\1${IFACE}\2${NORMAL}/"
}

alias ip='colored_ip'

3

为了设置提示,我将其保存在.bashrc文件中。

#Set variables for foreground colors
fgRed=$(tput setaf 1)     ; fgGreen=$(tput setaf 2)  ; fgBlue=$(tput setaf 4)
fgMagenta=$(tput setaf 5) ; fgYellow=$(tput setaf 3) ; fgCyan=$(tput setaf 6)
fgWhite=$(tput setaf 7)   ; fgBlack=$(tput setaf 0)
#Set variables for background colors
bgRed=$(tput setab 1)     ; bgGreen=$(tput setab 2)  ; bgBlue=$(tput setab 4)
bgMagenta=$(tput setab 5) ; bgYellow=$(tput setab 3) ; bgCyan=$(tput setab 6)
bgWhite=$(tput setab 7)   ; bgBlack=$(tput setab 0)
#Set variables for font weight and text decoration
B=$(tput bold) ; U=$(tput smul) ; C=$(tput sgr0)
#NOTE: ${C} clears the current formatting

if [[ $USER = "root" ]]; then
  PS1="${B}${fgRed}\u${C}@\h(\s): ${fgGreen}\w${C} > "
else
  PS1="${B}${fgCyan}\u${C}@\h(\s): ${fgGreen}\w${C} > "
fi

这给了我一个如下所示的提示:

user@host(bash): ~/bin >

工作目录为绿色。用户名是粗体和青色,除非我使用来运行外壳sudo,在这种情况下,用户名(“ root”)将显示为粗体和红色。

我个人真的很喜欢将格式控制字符存储在变量中,因为它使阅读用于设置提示的代码更加容易。这也使编辑提示更加容易。

我使用tput它的原因是,它应该比怪异的033[01;31m\]序列得到更广泛的支持。另外,作为额外的好处,如果您echo $PS1在提示符处执行操作,则将看到带有颜色的原始提示符,而不是那些难以理解的控制序列。


2

您可以尝试一个有助于对脚本输出进行着色的项目,该项目在源伪造处的名称为ScriptEchoColor:http ://scriptechocolor.sourceforge.net/

例如:

echoc "@{lr}text output in light red"
echoc "@{bLGu}text outpus in blue, light green background and underlined"
echoc "you @{lr} can @{bLGu} mix @{-a} it all too"
echoc -x "ls" #executes ls command and colorizes it automatically to be easy to be seen

自动颜色是可配置的。

这是一个完成的示例: 在此处输入图片说明


2

一个很棒的通用Python工具,它可以为命令的输出着色:' colout '

给它一个带有N个组的正则表达式,后跟一个用逗号分隔的N种颜色的列表。与组匹配的任何文本将以相应的颜色显示。

因此,例如,如果您正在查看一些测试输出:

python -m unittest discover -v

一些Python单元测试的无色输出

那么您可以通过以下方式进行修饰:

python -m unittest discover -v 2>&1 | colout '(.*ERROR$)|(.*FAIL$)|(\(.*\))' red,yellow,black bold

一些Python单元测试的彩色输出

看看我的正则表达式如何具有三个组(括号),然后是三个颜色(以及可选的三种样式),但是我使用速记将所有颜色设置为“粗体”,因此“黑”组与括号中的文本匹配,显示为深灰色。)

还请注意我必须添加2>&1到Python调用的末尾,因为unittest的输出在stderr上,所以我将其传输到stdout以便可以将其通过管道传输到colout中。

通常,它是如此容易使用,以至于我经常发现自己即时创建新的colout调用,并从命令行历史记录中重用或修改它们。

唯一的缺点是它作为Python软件包提供,而不是独立的可执行文件,因此您需要使用pip或安装sudo python setup.py install



1

我用彩色包装纸

cw是用于GNU / linux上基于unix的常见命令的非侵入式实时ANSI颜色包装器。cw旨在模拟正在执行的命令的环境,因此,如果有人在其外壳中键入“ du”,“ df”,“ ping”等,它将根据定义自动实时为输出着色包含所需颜色格式的文件。cw支持通配符匹配着色,标记化着色,页眉/页脚,案例方案着色,命令行相关的定义着色,并且包括50多个预制的定义文件。

它几乎是无缝的,但是一旦我发现交互式shell中的ps与管道中的ps进行比较会返回不同的输出。


0

对于Mac按规定您可以使用下面这里

if [ "$TERM" = xterm ]; then TERM=xterm-256color; fi

0

如果您想像vim我一样使自己的色彩缤纷,建议您遵循以下两个步骤:

  1. 通过以下链接了解如何打开功能:在vi或vim中打开突出显示颜色语法

链接中的关键步骤:

  1. 通过键入以下命令来编辑〜/ .vimrc文件:vi〜/ .vimrc

  2. 附加以下选项:语法on

  3. 保存并关闭文件

  4. 通过运行vim命令进行测试:vim foo.sh

  1. 找到您喜欢的配色方案并使用它。我使用的方案:我正在使用的方案

使用指向外部源的链接时,应检查指南相关部分的“为链接提供上下文”部分(引用重要部分):unix.stackexchange.com/help/how-to-answer
Gert van den Berg


0

我想谦虚地宣传我最近发布taor textattr,这是一个库和命令行工具,旨在通过将人类可读的规范转换为ANSI转义代码,使添加颜色和属性以美化程序的终端输出变得容易。

例如:

echo "The Git repo $(ta yellow)${CUR_REPO}$(ta off) is $(ta green)up-to-date$(ta off)"

甚至更短:

echo "The Git repo $(ta y)${CUR_REPO}$(ta f) is $(ta g)up-to-date$(ta f)"

或替代:

tawrite "The Git repo " @y ${CUR_REPO} @f " is " @g up-to-date @f "\n"

会给你类似的东西:

在此处输入图片说明

目前,除了您最喜欢的shell中的命令行使用之外,该库还可以从C,C ++,D和Python四种语言使用。

请注意,它不会自动使任何其他程序的输出着色。它是一个实用程序,可以帮助您不必记住复杂的代码。您只需要使用明显的颜色名称或易于记忆的rgb cmyk w(hite)(of)f缩写。

有关更多详细信息,请访问textattr回购

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.