我有一个非常简单的脚本来为bash中的Maven输出着色。它在Linux下运行良好,但在OS X下根本不适用
# 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有什么关系?我需要做些什么才能让颜色正常工作?
答案 0 :(得分:2)
您在Linux上找到的sed
的GNU版本与OS X上的版本略有不同。您遇到的差异是GNU版本解释了十六进制转义(例如\x1b
- > ASCII ESC字符)并将它们转换为相应的字符(在本例中为转义字符),而OS X版本则不会。
幸运的是,这是一个简单的解决方案:而不是指望sed
进行转义解释,告诉bash
为你做这件事:
local BLUE=$'\x1b[0;34m'
local RED=$'\x1b[0;31m'
...etc
Bash的$'...'
引号格式确实转义解释,因此当您在sed
命令中使用这些变量时,它们已被解释并按预期替换。< / p>
请注意,同样的脚本在Linux上也可以正常工作。