gpt4 book ai didi

Bash 是否可以回显存储在变量中的命令的颜色输出?

转载 作者:行者123 更新时间:2023-12-04 12:49:44 24 4
gpt4 key购买 nike

在我的脚本中,我有以下几行:

str=$(command) 

然后我想使用红色回显命令的输出:
echo -e "\e[31m$str\e[0m"  

但它继续以默认颜色打印。
发现有趣的事情:当我添加 --color在我的命令结束时,它确实以红色打印命令输出,但它说如下:
Invalid command line options. Usage:
kes4lwks-control [-L] --show-license-info <file>

有没有机会以彩色打印该命令的输出?
如果你需要,我正在执行下一个命令:
/opt/kaspersky/kes4lwks/bin/kes4lwks-control --show-license-info <path-to-lic-file>

更新:
我上面的代码完美地工作,当命令执行时没有错误(返回 0),但是当它说,例如,
Error, couldn't show infromation on the license: signature of license key is invalid.

回显文本没有颜色。
我可能需要与 stderr 描述符有关吗?

最佳答案

由于没有区分输出到 stdout 的正常程序输出和输出到 stderr 的错误消息,您会感到困惑。

执行

str=$(command)

导致命令在其标准输出重定向的情况下执行,但不更改标准错误。结果是发送到 stderr 的错误消息将立即出现在 stderr 上,这可能仍然是您的终端。

重定向到 bash 进程,它捕获输出(即到 stdout),并在命令完成后将收集的输出分配给 shell 变量。如果出现错误并且没有向标准输出发送任何内容,则 shell 变量最终将设置为空字符串。

所以
str=$(command)
printf '\033[31m%s\033[0m\n' "$str"

会直接输出错误信息,会捕获并稍后输出常规输出。 (我将 echo 更改为 printf 并将 \e 更改为 \033 以使命令可移植。另请参阅下面的注释 1。)

如果您只想为输出着色,则根本不需要在变量中捕获输出。只需在执行命令之前和之后发送适当的颜色序列:
printf '\033[31m'
command
printf '\033[0m'

这将为命令的所有输出着色。 (当然,输出本身可能包含颜色序列,但没有简单的方法可以解决这个问题。)

如果您有其他原因来捕获输出(这似乎不太可能),您可以使用重定向到 stdout 的 stderr 运行命令。在这种情况下,您将在 shell 变量中同时获得 stdout 和 stderr 输出(混合):
str=$(command 2>&1)

笔记
  • 尽管使用 ANSI 颜色序列可能适用于任何运行 bash 的现代平台,但有些人会推荐使用 tput命令以访问 terminfo数据库。例如,
    tput setaf 1   # Set terminal to ANSI colour 1 (red)
    command
    tput sgr0 # Reset all terminal attributes
    tput setaf 0与控制序列不一样ESC [ 0 m . setaf 0将前景色设置为黑色,如果您使用黑底白字的控制台,这将使输出不可见,而 ESC [ 0 m将所有字符显示属性重置为其默认值。这也是tput sgr0被定义为做,尽管它也可能重置其他终端属性。 (使用我的 terminfo 设置, tput sgr0 输出 ESC ( B 后跟 ESC [ m ;前者重置终端字体映射,我认为这在我的情况下是多余的。但是 YMMV。)

    可能(但不太可能)没有 setaf您终端的条目,在这种情况下,您应该回退到 setf ;但是,颜色编号不同,因此 setf 1是蓝色和setf 4是红色的,而 setaf 1是红色和setaf 4是蓝色的。所有这些令人费解的细节都记录在 man 5 terminfo 中。 .搜索“色彩处理”并享受。如果您使用的是 Linux,您可能还会发现 man 4 console_codes 有趣的阅​​读。
  • 关于Bash 是否可以回显存储在变量中的命令的颜色输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32178886/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com