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

3

可能重复:
将数据传输到期望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我是一个终端?
1个回答

1

程序通常会自动确定(ls --color=auto)是否连接了终端。这是通过检查stdout/err文件描述符进行的。

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

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


如果您能详细说明“通过检查stdout / err文件描述符来实现”,那将非常好,因为这似乎正是问题所在。 --color = auto是如何实现的? - The Godfather
@TheGodfather POSIX有一个库调用isatty(int fd)。例如,调用isatty(STDOUT_FILENO)和/或isatty(STDERR_FILENO)。这应该可以完成任务,并且可能是大多数程序所做的。虽然可能还有其他机制。 - Jo So
当Python脚本在PyCharm终端中执行时,“isatty”将会是False,但是该终端支持颜色。 - The Godfather
@TheGodfather 你怎么知道在PyCharm终端中isatty会是False?我不熟悉PyCharm,也不知道其他检测终端的方法。 - Jo So
如果你想了解它是如何工作的,可以从这里开始:https://github.com/c9/node-gnu-tools/blob/master/grep-src/src/main.c。只需查找“--color”,“auto”,“isatty”等即可。 - Jo So
我运行了一个Python脚本,它打印了isatty的返回值,显然... - The Godfather

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接