2011-03-08 72 views
2

我已經寫了一個測試腳本,我通常從cygwin bash調用。該測試腳本使用轉義序列對其輸出顏色,即如何避免基於終端類型打印轉義序列?

OKSTRING="\E[32;42mOK \033[39;49m" 
echo -e " $OKSTRING" 

如果成功。實際上,字符串OK不可見,因爲前景和背景具有相同的顏色。所以,我只輸出一個綠色,黃色或紅色框來表示測試結果。

現在,我想運行與Hudson構建步驟相同的腳本。轉義碼使輸出非常難以閱讀。

是否有任何方法可以影響轉義代碼的打印而不必將更多信息傳遞給測試腳本本身?

我知道我可以使用命令行參數來做到這一點,並在我傳遞某個參數時重新定義OKSTRING。但是我正在尋找一些更簡單的方法(即在腳本之外設置一些環境變量,並且echo知道它不應該打印轉義序列)。

回答

3
if [ -t 1 ] 
then 
    echo -e "\E[32;42mstdout is a tty" 
else 
    echo "stdout is not a tty" 
fi 
+0

我覺得那很簡單。謝謝! – eckes 2011-03-08 14:36:11

1

當我明白你的問題,在情況下,您手動從命令行運行腳本,你想擁有它的打印顏色代碼,而當它是通過哈德森運行構建服務器,你希望它只是打印純文本。

您可以測試終端是否被認爲是tty與isatty庫調用,儘管您可能有這種情況不會正是您想要的(即它可能會遺漏某些情況)。 Bash提供訪問-t測試

-t fd 
    True if file descriptor fd is open and refers to a terminal. 

Accorting到LDP,以下是測試交互/非交互

if [[ -t 0 || -p /dev/stdin ]] 
then 
    echo interactive 
else 
    echo non-interactive 
fi 
1

的優先停留的方式如果使用tput而不是硬編碼的逃生序列,您可以設置TERM變量來控制是否輸出色碼。它具有將輸出移植到xterm之外的終端的好處。

$ printf '%s\n%s\n' "setaf 2" "setab 2" | tput -S; echo -n hi; tput sgr0; echo 
[green box] 
$ (TERM=dumb; printf '%s\n%s\n' "setaf 2" "setab 2" | tput -S; echo -n hi; tput sgr0; echo) 
hi 

第二個是在子shell運行,因此TERM返回到其先前的值時,子外殼退出。

爲了避免重複調用tput,你可以把它在你的腳本的開頭短短的時間,並設置變量來保存序列:

allgreen=$(printf '%s\n%s\n' "setaf 2" "setab 2" | tput -S) 
none=$(tput sgr0) 
echo "${allgreen}hi${none}" 

然後,你可以打電話給你的腳本在子shell或預先安排變量賦值(或自己保存並恢復TERM)。

$ TERM=dumb ./your_script 

這使調用的本地分配。