在我的剧本中,我有以下几行:
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描述符有关吗?
答案 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)
虽然使用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
有趣的阅读。