我制作了一个 bash 脚本,生成彩色输出。从交互式 shell 调用脚本时,颜色很好。但是,如果输出在另一个脚本中处理,或者通过管道传递,则它不应该被着色(我认为)。
通常如何处理这种情况?我应该提供一个选项来打开/关闭彩色输出,还是有办法在脚本中自动检测到这一点?最好它自动工作,我只需要最少的代码来输出彩色/非彩色,具体取决于脚本调用......
自动检测的一个问题似乎是脚本总是以非交互方式运行,因此我必须知道父 shell 的交互状态。
答案1
支持颜色输出(例如grep
和ls
)的 UNIX 应用程序通常具有命令行选项以及可能的自动检测功能。
看着man ls
我们看到
--color[=WHEN]
colorize the output. WHEN defaults to `always' or can be `never' or `auto'. More info below
所以默认情况下 ls 将始终使用颜色,请注意该auto
选项。
man grep
显示类似
--color[=WHEN], --colour[=WHEN]
<snipped> WHEN is never, always, or auto.
如果auto
启用该选项(对于您的应用程序来说,这可能是默认选项),那么您可能正在寻找类似以下答案(由吉尔斯建议)的内容https://unix.stackexchange.com/a/10065/4635
也就是说,如果您的输出是终端并支持颜色,并且用户尚未禁用它,您应该使用颜色。当然,用户使用always
或never
跳过此检查。
我发现如果程序有 a--color=always
即使它们支持自动检测,它也很有用,因为这意味着我可以“当我更了解时”强制使用颜色(假设我的目的地不是终端,但我知道它支持颜色)。在某些系统上,我有一个别名ls
to ls --color=always
。