bash - shell 如何检测终端是否支持颜色

标签 bash colors terminal

<分区>

Possible Duplicate:
Piping data to Linux program which expects a TTY (terminal)

我想显示来自非交互式脚本的颜色,我需要告诉 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) 是否连接了终端。这通过检查 stdout/err 文件描述符来实现。

如果您通过管道与 Python 来回传输(如您在上面的示例中所做的那样),程序会将其标准输出/错误连接到管道,而不是终端,因此通常不会输出颜色代码。

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

关于bash - shell 如何检测终端是否支持颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12545316/

相关文章:

linux - 通过终端有选择地从分隔文件中提取字段

bash - 使用 bash 循环遍历子目录并爆炸文件名

linux - 在 RHEL 7.4 的目录中递归查找字符串并将其替换为 "/"

android - 在 Android 中获得可缩放、复杂、可着色形状的最佳方式是什么?

Bash 读取行在文件中间停止

Android 调色板不起作用?

重置 ggplot 分面每列中的颜色

linux - 如果 Bash 中显示特定错误,如何在 for 循环中继续重复迭代?

macos - 使终端根据ssh主机名使用其他颜色的简单方法是什么?

unix - 将终端选项卡标题设置为 unix 中的提示名称