如何在Linux终端输出带有颜色的文本?
如何在Linux终端中输出彩色文本?
在输出任何颜色之前,需要确保处于终端环境中。可以使用以下命令检查终端环境:
[ -t 1 ] && echo 'Yes I am in a terminal' # isatty(3) call in C
然后需要检查终端是否支持彩色输出。在基于Linux的系统上,可以通过以下命令获取终端支持的颜色数量:
Number_Of_colors_Supported=$(tput colors)
在基于BSD的系统上,可以通过以下命令获取终端支持的颜色数量:
Number_Of_colors_Supported=$(tput Co)
然后根据结果做出决定:
[ ${Number_Of_colors_Supported} -ge 8 ] && { echo 'You are fine and can print colors' } || { echo 'Terminal does not support color' }
如果终端支持彩色输出,则可以使用以下命令定义颜色变量:
在基于BSD的系统上:
fg_black="$(tput AF 0)" fg_red="$(tput AF 1)" fg_green="$(tput AF 2)" fg_yellow="$(tput AF 3)" fg_blue="$(tput AF 4)" fg_magenta="$(tput AF 5)" fg_cyan="$(tput AF 6)" fg_white="$(tput AF 7)" reset="$(tput me)"
在基于Linux的系统上:
fg_black="$(tput setaf 0)" fg_red="$(tput setaf 1)" fg_green="$(tput setaf 2)" fg_yellow="$(tput setaf 3)" fg_blue="$(tput setaf 4)" fg_magenta="$(tput setaf 5)" fg_cyan="$(tput setaf 6)" fg_white="$(tput setaf 7)" reset="$(tput sgr0)"
然后可以使用以下方式输出彩色文本:
echo -e "${fg_red} Red ${fg_green} Bull ${reset}"
这样就可以在Linux终端中输出彩色文本了。
如何在Linux终端中输出彩色文本?
问题的原因是作者编写了一个C++类,用于设置输出的前景色和背景色。作者提供了一个示例程序,演示了如何打印出“This ->word<- is red.”并以红色突出显示“word”的前景色。
解决方法是使用一个名为"colormod.h"的头文件来定义一个名为Color的命名空间。在命名空间中,定义了一个Modifier类,其作用是将颜色代码添加到输出流中,以实现彩色文本的输出。然后在主函数中,通过创建Modifier对象并将其传递给输出流,来设置输出的颜色。
在进阶部分,作者提到可以为该类添加其他功能,例如添加洋红色和加粗等样式。并提供了一个参考链接,以便了解如何添加更多颜色和样式。
其他评论中也提到了一些额外的颜色选项,并提出了一些改进的建议,如定义operator<<来直接输出颜色代码,或者通过添加一个标志来控制是否显示彩色文本。
,要在Linux终端中输出彩色文本,可以使用作者提供的C++类和头文件,通过创建Modifier对象并将其传递给输出流,来设置输出的颜色。还可以根据需要添加其他颜色和样式的代码,并通过改进提供的代码,实现更多功能和控制选项。
如何在Linux终端中输出彩色文本?
你需要输出ANSI颜色码。请注意,不是所有的终端都支持这个功能;如果不支持颜色序列,将会显示垃圾字符。
示例:
cout << "\033[1;31mbold red text\033[0m\n";
在这里,`\033`是ESC字符,ASCII码为27。紧随其后的是`[`,然后是由`;`分隔的零个或多个数字,最后是字母`m`。这些数字描述了从该点开始切换到的颜色和格式。
前景色和背景色的代码如下:
foreground background black 30 40 red 31 41 green 32 42 yellow 33 43 blue 34 44 magenta 35 45 cyan 36 46 white 37 47
另外,你还可以使用以下代码:
reset 0 (所有都恢复为正常状态) bold/bright 1 (通常是同一种颜色的更亮的阴影) underline 4 inverse 7 (交换前景色和背景色) bold/bright off 21 underline off 24 inverse off 27
参见维基百科上的表格,获取其他不常见的支持代码。
要确定你的终端是否支持颜色序列,请读取`TERM`环境变量的值。它应该指定所使用的特定终端类型(例如`vt100`,`gnome-terminal`,`xterm`,`screen`等)。然后在terminfo数据库中查找该值,并检查`colors`功能是否存在。
这在BBS上非常流行...
`m`是什么意思?
从表格上看,它似乎非常随意。
这个ANSI称为"SGR代码"或"设置图形修饰",用于修改属性。大多数终端都支持前8种颜色,但是对于上面的颜色,可能会出现问题。当然,这不会对任何东西造成伤害,但最好不要养成这个习惯,更不应该传播这种建议。看看下一个答案,有更好的主意(我在这里是公正的),你应该避免检查terminfo,因为有很多库和二进制文件可以为你做这个。
`\033[`和`m`标记了ANSI颜色代码转义序列的开始和结束。参考:en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes
我使用它定义“操纵器”,例如`const std::string red("\033[0;31m");`或`const std::string reset("\033[0m");`。然后,我可以简单地写`cout << red << "red text" << reset << endl;`。
我会查看这个网站以可视化颜色:misc.flogisoft.com/bash/tip_colors_and_formatting
显然,这对其他语言也适用,比如Java!谢谢!