这个问题类似于 我可以将 shell 配置为以不同颜色打印 STDERR 和 STDOUT 吗?
但我正在寻找一个解决方案,让我能够将 STDOUT 和 STDERR 更改为一种颜色。我不想为 STDOUT 和 STDERR 设置不同的颜色,因为这是有问题的,并且可能会产生问题,如上面链接的答案中提到的。
抱歉,我对 Unix 和 Linux 不太了解。我正在寻找一种解决方案,可以让我向我的.bashrc
or.bash_profile
和中添加几行永久更改 STDOUT 和 STDERR 的颜色。
答案1
STDOUT 和 STDERR 没有颜色。有颜色的是你的终端(模拟器);它有一一次设置前景(和一种背景颜色)。
还应该注意的是 STDOUT 和 STDERR 不是单一的——它们是每个进程输出流。不存在适用于所有程序的全局 STDOUT。这些流被路由到您的终端,但它们对于每个进程都是不同的。
终端仿真器通常有通过菜单设置调色板的方法,这样默认前景(适用于通过接收的数据两个都STDOUT 和 STDERR 流)可以是任何东西。您还可以申请提示中的 ANSI 颜色代码和如果你不重置颜色到\[\033[0m\]
最后,它将继续适用。请注意,某些应用程序使用这些并重置,因此这不是一个非常理想的方法,因为重置将返回到终端的默认设置。
如果设置终端前景不是您想要的,您可以在每个进程的基础上过滤 STDOUT/STDERR;看到这里的建议。
答案2
对于zsh
支持 16 种或更多颜色的终端xterm
:
preexec() printf '\e[90m' # set foreground color to grey before running
# the command
precmd() printf '\e[m' # reset the foreground color before issuing the
# next prompt.
请注意,命令本身可能会更改终端的前景色。
答案3
这似乎是一个问题XY-问题- 它没有要求正确的事情来获得所需的解决方案:
假设输出是彩色的,并且屏幕的空白部分是不同的颜色或填充有字符。
考虑一下您期望输出如何查找这些情况:
一个空的线?仅由空格字符填充的行?线路与一个空间仅限角色?用一个标签?一个空格和一个制表符?一个制表符和一个空格?是的,他们一切看起来都不一样!
或者你想要一个空行看起来像-只是一个空行?
如果是这种情况,您确实不想为输出流着色,并且这个答案适用。
我将给出与@StéphaneChazelas 的解决方案类似的方法,但“相反”:
你能,从技术上讲,颜色 STDOUT 和 STDERR,逐行,添加正确的颜色转义代码行的开始和结束在两个流上。
你需要注意重置颜色至少每一行,因为否则任何使用颜色的程序,例如ls
, 都会弄乱你的终端。
你只要有没有太多控制超过输出颜色 - 因此很难做到最好。
但是:你可以控制所有其他使用的颜色,对吗?
你呢只需要一个在这种情况下颜色?伟大的!
设置终端默认颜色到 STDOUT/STDERR 颜色,然后根据您的喜好为其余部分着色。
你可以给你上色外壳提示符- 并使用提示代码也为其他部分着色。
诚然,这有点给命令行着色很棘手,您可以在其中编辑命令,但这当然是可能的。但bash
如果你可以使用,请不要尝试zsh
,作为提示处理代码非常多更灵活那里 - 这就是你需要的。
现在,将终端默认前景色设置为灰色,可能还有背景色 - 但尝试将其保留为透明/未定义。
要设置命令行的背景颜色,请查看以下示例: 当我更改提示主题时更改 zsh 中命令行的背景颜色:
PROMPT="%{$bg[cyan]%}%{$fg[red]%}%n%{$reset_color%}%{$bg[cyan]%}@%{$fg[red]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%{$bg[cyan]%}%% "
(困难的部分是在各种情况下正确处理 lins 未使用的末端部分。)