【问题标题】:how shell detect if terminal support colors [duplicate]shell如何检测终端是否支持颜色[重复]
【发布时间】:2012-09-22 15:54:42
【问题描述】:

可能重复:
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 我是终端?

【问题讨论】:

    标签: bash colors terminal


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果您能详细说明“通过检查标准输出/错误文件描述符来实现”,那就太好了。因为这似乎正是问题所在。这个--color=auto是如何实现的?
    • @TheGodfather POSIX 有一个库调用 isatty(int fd)。例如。致电isatty(STDOUT_FILENO) 和/或isatty(STDERR_FILENO)。这应该可以完成工作,并且可能是大多数程序所做的。不过,可能还有其他机制。
    • 在 PyCharm 终端中执行 python 脚本时,isatty 将为 False,但终端支持颜色。
    • @TheGodfather 你怎么知道 isatty 在 PyCharm 终端中是 False ?我不知道 PyCharm,也不知道检测终端的其他方法。
    • 如果你想了解它是如何工作的,你可以从这里开始:github.com/c9/node-gnu-tools/blob/master/grep-src/src/main.c。只需寻找“--color”、“auto”、“isatty”等
    猜你喜欢
    • 2021-11-19
    • 2021-03-30
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2011-09-12
    • 2012-11-11
    • 1970-01-01
    相关资源
    最近更新 更多