我有一個Mac App(CodeRunner),它在登錄模式下執行腳本並在窗口中顯示輸出。 在錯誤情況下,它會返回帶有轉義字符的代碼,以使輸出難以閱讀。使用顏色代碼處理bash輸出
有沒有辦法來處理顏色代碼?是否有過濾器來刪除顏色代碼?
我有一個Mac App(CodeRunner),它在登錄模式下執行腳本並在窗口中顯示輸出。 在錯誤情況下,它會返回帶有轉義字符的代碼,以使輸出難以閱讀。使用顏色代碼處理bash輸出
有沒有辦法來處理顏色代碼?是否有過濾器來刪除顏色代碼?
在Mac OS X中,我使用了stderred庫。
#export DYLD_INSERT_LIBRARIES="/LOCATION_OF_THE_LIB/libstderred.dylib${DYLD_INSERT_LIBRARIES:+:$DYLD_INSERT_LIBRARIES}"
刪除此庫設置將顯示沒有代碼的字符串。
如果我理解你的問題,在bash(或支持它們的任何終端)中控制顏色的最簡單方法是使用ANSI轉義序列。例如:
#!/bin/bash
blue='\e[0;34m' # ${blue}
green='\e[0;32m' # ${green}
nc='\e[0m' # ${nc} (no color - disables previous color selection)
printf "${blue}This text is blue, ${green}this is green${nc}\n"
exit 0
有許多在網絡上提供的ANSI序列完整的參考,但對於基本顏色,以下通常是足夠的:
black='\e[0;30m' # ${black}
blue='\e[0;34m' # ${blue}
green='\e[0;32m' # ${green}
cyan='\e[0;36m' # ${cyan}
red='\e[0;31m' # ${red}
purple='\e[0;35m' # ${purple}
brown='\e[0;33m' # ${brown}
lightgray='\e[0;37m' # ${lightgray}
darkgray='\e[1;30m' # ${darkgray}
lightblue='\e[1;34m' # ${lightblue}
lightgreen='\e[1;32m' # ${lightgreen}
lightcyan='\e[1;36m' # ${lightcyan}
lightred='\e[1;31m' # ${lightred}
lightpurple='\e[1;35m' # ${lightpurple}
yellow='\e[1;33m' # ${yellow}
white='\e[1;37m' # ${white}
nc='\e[0m' # ${nc} (no color - disables previous color selection)
注:總是重置顏色默認設置爲${nc}
('\e[0m'
)以避免在腳本完成後繼續使用顏色。最後,如果使用echo
,則必須使用echo -e
來處理ANSI代碼。
注2:,因爲你所看到的代碼,而不是顏色,你有幾種可能(1)您使用echo
沒有-e
選項允許碼的正確解釋(或類似的東西);或者(2)您使用的終端缺乏顏色功能(儘管這是值得懷疑的,因爲幾乎所有現代終端都是基於VT的默認顏色處理)。
根據下面的評論建議,您還可以使用tput
(背景爲setab #
,前景爲setaf #
)設置顏色。
他的輸出已經有了轉義碼(或者是其中的一部分)。他希望他們能夠正確解釋或從輸出中刪除。 – chepner
建議使用'tput'來確定當前終端的正確代碼可能是一個好主意。 –
控制字符(轉義)仍然在輸出中或被某些東西剝離了嗎? –
@Etan Reisner:他們都在那裏,附加的圖片是從輸出窗口捕獲的屏幕。 – prosseek
顏色代碼是'\ E [31m',其中'\ E'是一個轉義符。該輸出顯示字符串的非轉義部分。我假設逃跑在那裏,但他們可能已經不在這一點。無論程序如何生成該輸出,都可能需要對其提交一個錯誤信息,以便在不輸出到終端時不輸出顏色代碼。 –