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

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

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

这里有一些技巧经过大量实验后,我的设置得以实现:


我倾向于设置TERM=xterm-color,大多数主机(但并非全部)都支持该设置。
我在许多不同的主机上工作主机,不同的OS版本等。我使用从macOS X,Ubuntu Linux,RHEL / CentOS / Scientific Linux和FreeBSD来的所有内容。如果可能的话,我试图使事情简单和通用。
我使用GNU screen进行了大量工作,这又增加了一层乐趣。
许多操作系统都将dircolors设置为默认值,并且我不想在一百台不同的主机上进行修改。因此,我尝试使用默认值。相反,我调整了终端的颜色配置。

对某些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

有人看到过为列着色的工具吗?那是-t --color列?

#1 楼

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

编辑器+代码
许多编辑器都支持语法突出显示。 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 "s/\[^[[0-9;]*[a-zA-Z]//gi"


如果想要更真实的体验,还可以摆脱以sed开头的行,该行指示终端隐藏文本。 (不受广泛支持。)

sed "s/^\[^[8m.*$//gi"


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

评论


PS1的第一行应如下所示:PS1 ='\ e [33; 1m \ u @ \ h:\ e [31m \ W \ e [0m \ $']。第四个反斜杠后有多余的x。

–克里斯
13年5月23日在7:30

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

– hgajshb
13年8月29日在19:09



ls --color = always无效。 @Michael Durrant的方法对此更好:ls --color = al> / dev / null 2>&1 &&别名ls ='ls -F --color = al'||别名ls ='ls -G'

–西蒙C.
19年2月1日在6:51

#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='\[3]0;\u ${NEW_PWD}q4312078q7\]'
          ;;
     *)
         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 Dunn
2012-09-10 15:53

我已经更新了答案,以反映提示中颜色的转义括号。谢谢!

–克里斯
2014年11月27日7:57

$ LSCOLORS和$ CLICOLOR用于BSD ls。 GNU ls(Linux)使用具有不同语法的$ LS_COLORS。因为GNU对我来说就像家一样,所以我使用LSCOLORS = exgxfxDacxBaBaCaCaeaEa在BSD上模拟GNU的颜色。

–亚当·卡兹(Adam Katz)
15年1月12日在22:22

grep:警告:GREP_OPTIONS已过时;请使用别名或脚本

–史蒂文·阿尔默洛斯(Steven Almeroth)
16年11月23日在21:19

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

– amiabl
19年4月4日在18:43



#3 楼

grepls已经提到过,如果您想了解更多颜色,请查看Generic Coloriser,其最初目的是为日志文件着色,但是开箱即用,它也为pingtraceroutegccmakenetstatdifflastldapcvs

如果知道正则表达式,它很容易扩展。我已将psnmap添加到列表中(如果您喜欢grc,我将非常高兴为这两个工具共享.conf文件)(顺便说一句,请通过synaptic安装它,pacman等,您可能会更好地寻找“ grc”)

评论


grc现在默认情况下支持ps。我会对您的nmap着色感兴趣。另请参阅我的答案,以在升级grc时吸收所有新命令的方式对所有这些进行混叠。

–亚当·卡兹(Adam Katz)
15年1月13日,下午3:05

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

–西戈
2015年2月6日在21:29



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

–亚当·卡兹(Adam Katz)
2015年2月7日,下午1:54

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

–西戈
2015年2月7日在2:48

#4 楼

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


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

我的功能PS1提示:


显示git分支!
“修剪”长目录路径(超过6个元素)以显示前3个和后3个目录,其间有_(即
最后返回回车,以便提示始终在左侧!

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


对于ls有可用颜色,没有时没有错误(例如OSX):

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


评论


颜色在OS X上适用于ls,但是可以通过使用export CLICOLOR = 1来完成。

– ThomasW
15年3月4日在9:47

@ThomasW,但不是在Linux上:-p这个家伙同时使用。

–吉米·凯恩(Jimmy Kane)
15年12月4日在16:58

尽管如此,ThomasW是正确的指出答案是错误的,因为在MacOS 10上ls不能使用颜色。答案也是错误的,因为这里的提示字符串实际上是错误的。它们不能正确地平衡\ [和\],并已导致至少一个人复制此答案时遇到问题。

– JdeBP
16年11月17日在4:16

#5 楼

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

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##*:?.=}" 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


安装grc(通用增色剂)并将其添加到您的别名:

# 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
}


差异的颜色:函数的内容太多,请使用脚本并在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 = ( eq "<" ? 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 "\[3[${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




评论


赞成截图

–绿色
17年7月13日在4:39

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

–亚当·卡兹(Adam Katz)
17年8月23日在23:09



CLICOLOR = 1在FREEBSD 11.2中对我不起作用

–西蒙C.
19年2月1日在6:52

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

–亚当·卡兹(Adam Katz)
19年2月4日在17:30

@SimonC。 –您必须实际加载〜/ .bashrc才能使所有更改生效。运行源〜/ .bashrc或启动新的bash会话(启动终端或运行bash)。

–亚当·卡兹(Adam Katz)
19-2-4在19:03



#6 楼

设置粗体/彩色提示。从cyberciti.biz和BashFAQ中

# '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!),并且如果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


评论


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

–tsvallender
2010年8月12日在9:27

#7 楼

在这里还没有说过的话:

要用gcc为编译结果着色,请使用JohannesSchlüter的colorgcc

要着色日志,请使用multitail

要着色任何标准输出,我将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


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

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


对不起,不允许发布更多链接

评论


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

– Artur Vieira
17/12/21在22:50



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

– helle
18-2-22在16:08

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

–西里尔·查博索(Cyril Chaboisseau)
18年5月30日在6:18

#8 楼

有一个很好的工具可以为ls命令设置颜色-http://geoff.greer.fm/lscolors/

#9 楼

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



评论


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

–查尔斯·亚迪斯
16年7月12日在16:56

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

–查尔斯·亚迪斯
16年7月12日在17:01

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

–乔纳森·哈特利
16年8月31日在10:32

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

–通配符
18年8月15日在1:21

谢谢您的关注,但我的评论说了我想说的一切。

–乔纳森·哈特利
18年8月17日在15:25

#10 楼

要查看彩色差异输出,请使用colordiff。

sudo apt-get install colordiff


将任何差异格式输出放入colordiff中: br />这包括diff的一些替代格式,例如-y(并排。) ',并为输出着色。因此,我在我的.bashrc中有这个名称,将'diff'别名为colordiff。

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


评论


.bashrc示例缺少最后一个fi,可以将其转换为单行命令:type colordiff&> / dev / null && alias diff ='colordiff'

– Teemu Leisti
19-2-27在8:05



#11 楼

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

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


对于Bash:

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


评论


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

–manatwork
2012年1月26日上午9:21

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

– Mischa Arefiev
2012年1月26日上午9:53

#12 楼

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

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

例如,这就是给ip的输出着色的方法:

#
# Colorcodes
#
NORMAL=`echo -e '3[0m'`
RED=`echo -e '3[31m'`
GREEN=`echo -e '3[0;32m'`
LGREEN=`echo -e '3[1;32m'`
BLUE=`echo -e '3[0;34m'`
LBLUE=`echo -e '3[1;34m'`
YELLOW=`echo -e '3[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]\+\)/${IFACE}${NORMAL}/"
}

alias ip='colored_ip'


#13 楼

为了设置提示,我将其保存在我的.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,您将看到带有颜色的原始提示符,而不是那些难以理解的控制序列。

#14 楼

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

例如:



自动颜色是可配置的。

这是一个使用它的示例:


#15 楼

用于给命令输出着色的一个很棒的通用Python工具是'colout'

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

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

python -m unittest discover -v




然后可以使用:

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




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

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

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

唯一的缺点是它是Python软件包而不是独立的execu表,因此您需要使用pip或sudo python setup.py install进行安装。

#16 楼

我发现Solarized很有用。它是一个简洁的项目,具有统一的颜色,可用于许多应用程序。

http://ethanschoonover.com/solarized
https://github.com/altercation/solarized

#17 楼

您可以在命令行上使用cf来进行文件名着色,这是一种基于awk的快速着色器,可通过管道工作-为Truecolor sRGB中的文件名着色。

它具有鲜艳的默认配置,并且与ls不同,它不会因添加新颜色而遭受性能损失。 (ls必须为每个未命中扫描
整个LS_COLORS字符串)。

https://github.com/AdamDanischewski/cf





#18 楼

对于Mac,您可以按照此处指定的方式使用以下内容

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


#19 楼

我用彩色包装纸。


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

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

#20 楼

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

通过以下链接了解如何打开此功能:打开
vi或vim。


链接中的关键步骤:


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


追加以下选项:语法on


保存并关闭文件


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




找到所需的配色方案,然后使用它。我使用的方案:我正在使用的方案



评论


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

– Gert van den Berg
18年9月3日在6:48

#21 楼

如果您选择bash,我建议oh-my-bash。如果选择zsh,我建议oh-my-zsh。两者都支持终端的着色和不同的输出。

#22 楼

我想谦虚地宣传我最近发布的ta或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(隐藏)(缩写)。

有关更多详细信息,请访问textattr存储库。