2013-09-26 54 views
2

考慮從我的.bashrc以下ENV出口:如何編寫一個包含ansi的env-var而不遺漏env終端輸出?

LESS_TERMCAP_mb=$(printf "\e[1;31m") 
LESS_TERMCAP_md=$(printf "\e[1;31m") 
LESS_TERMCAP_me=$(printf "\e[0m") 
LESS_TERMCAP_se=$(printf "\e[0m") 
LESS_TERMCAP_so=$(printf "\e[1;44;33m") 
LESS_TERMCAP_ue=$(printf "\e[0m") 
LESS_TERMCAP_us=$(printf "\e[1;32m") 

這是罰款和按預期工作,但不幸的是,當我傾倒ENV到控制檯它輸出的ANSI顏色和基本攪亂終端的顯示。我可以使用env來減少清理ansi代碼,但我認爲可能有更好的方法來做到這一點。

我創建了以下函數,它在調用某些終端應用程序之前基本上設置了這些變量,但並未針對所有應用程序進行設置。

less() { 
    env \ 
    LESS_TERMCAP_mb=$(printf "\e[1;31m") \ 
    LESS_TERMCAP_md=$(printf "\e[1;31m") \ 
    LESS_TERMCAP_me=$(printf "\e[0m") \ 
    LESS_TERMCAP_se=$(printf "\e[0m") \ 
    LESS_TERMCAP_so=$(printf "\e[1;44;33m") \ 
    LESS_TERMCAP_ue=$(printf "\e[0m") \ 
    LESS_TERMCAP_us=$(printf "\e[1;32m") \ 
    less "[email protected]" 
} 

有沒有更好的辦法,或任何方式,以這樣的方式腳本環境變量,它們包含ANSI轉義序列,但他們不通過的時候顯示的env評價?

+0

我只是有一個想法,想我會如果有人有想法,請在此留言。除了包裝其他程序之外,我用一個bash函數來封裝env,除非它被傳送,否則它會轉義這些變量。這應該工作...現在查找如何在bash中找到isatty() –

+1

爲什麼在這裏需要'env'?在bash中你通常可以執行'X = 1 Y = 2 command'。我剛剛測試過它,而env _is_是必要的,但我不明白爲什麼! – cdyson37

回答

2

有可能是沒有辦法,而是採用env,使用set代替:

> set | grep ^LESS_TERM 
LESS_TERMCAP_mb=$'\E[1;31m' 
LESS_TERMCAP_md=$'\E[1;31m' 
LESS_TERMCAP_me=$'\E[0m' 
LESS_TERMCAP_se=$'\E[0m' 
LESS_TERMCAP_so=$'\E[1;44;33m' 
LESS_TERMCAP_ue=$'\E[0m' 
LESS_TERMCAP_us=$'\E[1;32m' 

另一種方式是明確地改變字符:

> env | grep ^LESS_TERMCAP | sed 's|\x1b|ESC|g' 
LESS_TERMCAP_mb=ESC[1;31m 
LESS_TERMCAP_md=ESC[1;31m 
LESS_TERMCAP_me=ESC[0m 
LESS_TERMCAP_ue=ESC[0m 
LESS_TERMCAP_us=ESC[1;32m 
LESS_TERMCAP_so=ESC[1;44;33m 
LESS_TERMCAP_se=ESC[0m 
+0

(忘記標記爲答覆很久以前,道歉) –