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 我是一个终端?

4

1 回答 1

1

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

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

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

于 2012-09-22T17:05:13.830 回答