外壳如何检测终端是否支持颜色



可能的重复项:
将数据管道传输到需要TTY(终端)的Linux程序

我想显示来自非交互式脚本的颜色,我需要告诉 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我是终端?

程序通常自动确定(ls --color=auto)是否有终端连接。这是通过检查标准输出/错误文件描述符来实现的。

如果你在 python 之间通过管道(就像你在上面的例子中所做的那样),程序的 stdout/err 将连接到管道,而不是终端,因此通常不会输出颜色代码。

尝试将进程的stdout/err直接重定向到连接的终端,而不是返回到您的python应用程序。如果这不可行(因为你需要python的输出 - 但在这种情况下,你通常不想要颜色代码),你将不得不以某种方式在python中设置伪终端。