2012-09-22 97 views
2

可能重複:
Piping data to Linux program which expects a TTY (terminal)shell如何檢測,如果終端支持顏色

我想要顯示從腳本,非交互式的顏色,我需要告訴shell,其實我腳本是支持顏色的終端,所以像ls --color=auto這樣的命令將顯示顏色(ls有選項--color=always,但我想支持所有支持顏色的可能命令)。

我通過python Popen調用我的shell。我嘗試設置TERM環境變量,但它不起作用。

subprocess.Popen(['/bin/bash', '-c', command], 
        env={'TERM':'xterm-color'}, 
        stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

有沒有辦法告訴bash我是一個終端?

回答

1

如果有終端連接,程序通常會自動確定(ls --color=auto)。這通過檢查stdout/err文件描述符。

如果你與python進行管道連接(正如你在上面的例子中所做的那樣),程序將把它們的stdout/err連接到管道而不是終端,因此通常不會輸出顏色代碼。

嘗試重定向進程的stdout/err 直接到附加的終端,而不是回到您的python應用程序。如果這是不可行的(因爲你需要Python中的輸出 - 但在這種情況下,你通常不需要顏色代碼),你必須在python中設置一個僞終端。