如何将 STDOUT 和 STDERR 颜色永久更改为灰色?

如何将 STDOUT 和 STDERR 颜色永久更改为灰色?

这个问题类似于 我可以将 shell 配置为以不同颜色打印 STDERR 和 STDOUT 吗?

但我正在寻找一个解决方案,让我能够将 STDOUT 和 STDERR 更改为一种颜色。我不想为 STDOUT 和 STDERR 设置不同的颜色,因为这是有问题的,并且可能会产生问题,如上面链接的答案中提到的。

抱歉,我对 Unix 和 Linux 不太了解。我正在寻找一种解决方案,可以让我向我的.bashrcor.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]%}%% "

shell 提示符示例

(困难的部分是在各种情况下正确处理 lins 未使用的末端部分。)

相关内容