bash颜色:osx与Linux

bash颜色:osx与Linux,linux,macos,bash,Linux,Macos,Bash,我有一个非常简单的脚本,可以在bash中为Maven输出着色。它在Linux下工作得很好,但在OSX下一点也不好 # Colorize maven output # Thanks to https://github.com/builddoctor/maven-antsy-color alias maven="command mvn" function color_maven() { local BLUE="\x1b[0;34m" local RED="\x1b[0;31m"

我有一个非常简单的脚本,可以在bash中为Maven输出着色。它在Linux下工作得很好,但在OSX下一点也不好

# Colorize maven output
# Thanks to https://github.com/builddoctor/maven-antsy-color

alias maven="command mvn"
function color_maven() {
    local BLUE="\x1b[0;34m"
    local RED="\x1b[0;31m"
    local GREEN="\x1b[0;32m"
    local YELLOW="\x1b[1;33m"
    local WHITE="\x1b[1;37m"
    local LIGHT_RED="\x1b[1;31m"
    local LIGHT_GREEN="\x1b[1;32m"
    local LIGHT_BLUE="\x1b[1;34m"
    local LIGHT_CYAN="\x1b[1;36m"
    local NO_COLOUR="\x1b[0m"
    maven $* | sed \
        -e "s/Tests run: \([^,]*\), Failures: \([^,]*\), Errors: \([^,]*\), Skipped: \([^,]*\)/${LIGHT_GREEN}Tests run: \1$NO_COLOUR, Failures: $RED\2$NO_COLOUR, Errors: $YELLOW\3$NO_COLOUR, Skipped: $LIGHT_BLUE\4$NO_COLOUR/g" \
        -e "s/\(\[\{0,1\}WARN\(ING\)\{0,1\}\]\{0,1\}.*\)/$YELLOW\1$NO_COLOUR/g" \
        -e "s/\(\[ERROR\].*\)/$RED\1$NO_COLOUR/g" \
        -e "s/\(\(BUILD \)\{0,1\}FAILURE.*\)/$RED\1$NO_COLOUR/g" \
        -e "s/\(\(BUILD \)\{0,1\}SUCCESS.*\)/$LIGHT_GREEN\1$NO_COLOUR/g" \
        -e "s/\(\[INFO\].*\)/$GREEN\1$NO_COLOUR/g"

        MAVEN_STATUS=$PIPESTATUS

        return $MAVEN_STATUS
}
在OSX下,我的输出是如何显示的:

x1b[0;32m[INFO] Scanning for projects...x1b[0m
x1b[0;32m[INFO] -----------------------------------------------x1b[0m
x1b[0;32m[INFO] x1B[0;31mBUILD FAILUREx1b[0mx1b[0m
x1b[0;32m[INFO] -----------------------------------------------x1b[0m
x1b[0;32m[INFO] Total time: 0.097 sx1b[0m
x1b[0;32m[INFO] Finished at: 2015-09-19T20:35:12+02:00x1b[0m
x1b[0;32m[INFO] Final Memory: 5M/123Mx1b[0m
x1b[0;32m[INFO] -----------------------------------------------x1b[0m
我认为这是
\x1b
控制序列的问题。我也试过用
\[\033
\033
代替它,结果是一样的

我的提示符也是彩色的,在Linux和OSX下工作,定义如下:

export PS1="\[\033[32m\]\u@\h\[\033[0m\] \[\033[0;35m\]\w\[\033[0m\]\[\033[0;31m\]\$(__git_ps1)\[\033[0m\] \[\033[0;35m\]$\[\033[0m\] "

所以问题是,OSX的处理方式是什么?我需要做什么才能让颜色正常工作?

您会发现Linux上的GNU版本的
sed
与OS X上的版本有点不同。您遇到的区别是GNU版本解释十六进制转义(例如
\x1b
->ASCII字符)并将它们转换为相应的字符(在本例中为转义字符),而OSX版本则没有

幸运的是,有一个简单的解决方案:与其指望
sed
来执行转义解释,不如告诉
bash
为您执行:

local BLUE=$'\x1b[0;34m'
local RED=$'\x1b[0;31m'
...etc
Bash的
$“…”
引号格式不需要解释,因此当您在
sed
命令中使用这些变量时,它们已经被解释,并按照您的预期被替换


请注意,同样的脚本在Linux上也可以正常工作。

只是猜测,但我认为这是Mac终端仿真器的问题,而不是OSX的问题。如果您尝试不同的终端仿真器来识别这些转义序列,您可能会更幸运,或者您当前的终端仿真器可能会识别不同的转义序列。您可以在您的终端上查看任何程序中的任何颜色?是的,我可以…我将更新问题可能是
sed
如何解释值的问题?在
tput setaf 1
之后是否有更改?