即使使用 --color=always,Grep 也不显示颜色

mar*_*321 3 linux bash shell grep docker

Grep 通常以红色显示突出显示的文本,这正是我想要的,但这次无论我做什么它似乎都不会这样做。我是从 Docker 容器(nginx:1.19-alpine更具体地说)执行此操作,并使用RUN apk add bash. 然后我添加了一个~/.bashrc包含以下内容的配置文件:

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

force_color_prompt=yes
color_prompt=yes

if [ "$color_prompt" = yes ]; then
    PS1=' ${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@server-nginx\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1=' ${debian_chroot:+($debian_chroot)}\u@server-nginx:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@server-nginx: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
alias ls='ls --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
Run Code Online (Sandbox Code Playgroud)

问题是它$ ls确实显示了彩色输出。但是当我尝试通过 grep 管道它时,它仍然是黑白的。

// Directories have colors!!
$ ls

// No color highlighting here
$ echo "baba" | grep --color=always ba

// No colors here either
$ ls | grep bin
Run Code Online (Sandbox Code Playgroud)

在不同的 Docker 映像上完全相同的设置工作得很好(php:7.4-fpmnode:14),所以也许该映像有一些特定的地方nginx:1.19-alpine,它不显示 grep 的颜色?

PSprintf '%q\n' "$GREP_COLORS" "$GREP_COLOR"打印此输出:

$ printf '%q\n' "$GREP_COLORS" "$GREP_COLOR"

ms=01\;33
''
Run Code Online (Sandbox Code Playgroud)

mar*_*321 10

经过一番摸索,我终于找到了解决方案。这个特定 Docker 镜像 ( ) 附带的 grep 版本nginx:1.19-alpine是某种“busybox 版本的 grep”。不管怎样,升级 grep 就成功了:

// Inside of Dockerfile added this
RUN apk add --no-cache --upgrade grep
Run Code Online (Sandbox Code Playgroud)

现在 grep 显示彩色输出。唷!希望这可以帮助其他可能遇到同样问题的人。