你可以通过这样做来为 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...