2015-09-19 40 views
2

我有一個非常簡單的腳本來着色bash中的Maven輸出。它在Linux下的偉大工程,但不是在所有下OS Xbash的顏色:OS X與Linux

# 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\]\[email protected]\h\[\033[0m\] \[\033[0;35m\]\w\[\033[0m\]\[\033[0;31m\]\$(__git_ps1)\[\033[0m\] \[\033[0;35m\]$\[\033[0m\] " 

所以現在的問題是,什麼是與OSX的交易?我需要做什麼才能讓顏色正常工作?

+0

只是一個猜測,但我會說這是Mac終端模擬器而不是OSX的問題。如果您嘗試使用不同的終端仿真程序來識別這些轉義序列,您可能會有更多的運氣,或者您當前的終端仿真程序可能會識別不同的轉義序列。 – stellarpower

+0

你能在終端上看到任何程序的顏色嗎? –

+0

是的,我可以...我會更新問題 – Leon

回答

2

sed GNU版本,你會發現在Linux上是在OS X的版本有些不同,你正在運行到不同的是,GNU版本的解釋十六進制轉義(如\x1b - >的ASCII字符ESC )並將它們轉換爲相應的字符(在這種情況下是轉義字符),而OS X版本不會。

幸運的是,有一個簡單的解決方案:而不是sed計數做逃生解釋,告訴bash來爲你做它:

local BLUE=$'\x1b[0;34m' 
local RED=$'\x1b[0;31m' 
...etc 

bash的$'...'報價格式不逃避解釋,所以當你使用這些sed命令中的變量,它們已被解釋並按照您的預期進行替換。

請注意,同樣的腳本也應該在Linux上正常工作。