为什么有些程序可以正确传递子程序的 TTY 颜色,而另一些则不能?

为什么有些程序可以正确传递子程序的 TTY 颜色,而另一些则不能?

你可以通过这样做来为 ttys 着色

myscript.sh:

#!/bin/bash
echo -e "This is \033[0;31mRED\033[0m"

通常,如果另一个“父”程序myscript.sh作为子进程运行,则颜色代码将正确传回,并且运行父程序的 shell 将显示子进程的颜色。

很多时候是行不通的。 GNU Make 是一个反例

生成文件:

foo:
    ./myscript.sh

如果我运行make foo那么输出是

This is \033[0;31mRED\033[0m

由于某种原因,make感觉需要转义子进程的输出。

我觉得这很令人惊讶,因为无论谁编写make都必须添加代码(这是额外的工作)才能创建反功能。或者应用程序是否会make在 tty 上打开一个开关,从而使所有内容自动转义?如果是这样,我可以覆盖此行为并强制程序将make子进程数据传递到 tty 而不对其进行转换吗?或者每个程序都以自己的方式控制这种行为?

答案1

问题是你的脚本依赖于非 POSIXbash功能,但是make正在使用/bin/sh对于 shell,它(例如 Debian)可能是不同的程序,例如dash(更符合 POSIX 标准的 shell)。

进一步阅读:

答案2

正如 Thomas 在他的回答中提到的,所使用的 shellmake与您手动运行脚本时使用的 shell 不同。

作为一般规则,如果您在脚本中使用特定于某个 shell 的功能,则应该将该特定 shell 放在 shebang 行中。

例如:

#!/bin/bash
echo -e "This is \033[0;31mRED\033[0m"

答案3

调用的脚本make需要使用文件系统echo,而不是内置文件系统

/bin/echo -e "\033...

相关内容