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

时间:2015-08-24 09:32:45

标签: bash

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

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描述符有关吗?

1 个答案:

答案 0 :(得分:3)

通过不区分正常程序输出到stdout和错误消息输出到stderr,你会让自己感到困惑。

执行

str=$(command)

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

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

所以

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

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

如果您只想输出颜色,则根本不需要捕获变量中的输出。只需在执行命令之前和之后发送适当的颜色序列:

printf '\033[31m'
command
printf '\033[0m'

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

如果您有其他理由捕获输出(这似乎不太可能),您可以运行命令,并将stderr重定向到stdout。在这种情况下,您将在shell变量中获得stdout和stderr输出(混合):

str=$(command 2>&1)

注释

  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中。搜索&#34;颜色处理&#34;享受。如果您使用的是Linux,您可能还会发现man 4 console_codes有趣的阅读。