如何在Linux终端中更改文本颜色
在终端中输出文本可以为用户带来单色体验。添加颜色很容易,所以在这里我提供了一个脚本,其中包含用于输出文本、使用定义的颜色以及处理暗模式与亮模式终端窗口的辅助方法。
目录
介绍
终端的默认文本输出是单色的,并且不提供提供上下文的简单方法。例如,您可能希望错误以红色显示,成功以绿色显示,或者重要信息以粗体显示。
为终端输出添加颜色很简单,涉及在文本之前输出正确的控制字符。
终端颜色
要输出彩色文本,您需要printf或echo -e(-e以确保控制字符被插入)所需颜色的控制字符,然后输出您的文本,然后(为了整洁)将输出重置为默认值。下表列出了代码
颜色 | 前景 | 背景 |
Default | \033[39m | \033[49m |
Black | \033[30m | \033[40m |
Dark red | \033[31m | \033[41m |
Dark green | \033[32m | \033[42m |
Dark yellow (Orange-ish) | \033[33m | \033[43m |
Dark blue | \033[34m | \033[44m |
Dark magenta | \033[35m | \033[45m |
Dark cyan | \033[36m | \033[46m |
Light gray | \033[37m | \033[47m |
Dark gray | \033[90m | \033[100m |
Red | \033[91m | \033[101m |
Green | \033[92m | \033[101m |
Orange | \033[93m | \033[103m |
Blue | \033[94m | \033[104m |
Magenta | \033[95m | \033[105m |
Cyan | \033[96m | \033[106m |
White | \033[97m | \033[107m |
重置代码为 \033[0m
前景色字符串的格式为:
"\033[" + "<0 or 1, meaning normal or bold>;" + "<color code> + "m"
而背景的格式为:
"\033[" + "<color code>" + "m"
这些代码可以一起输出,以便同时更改前景色和背景色。
使用代码
一个简单的红色文本示例
printf "\033[91mThis is red text\033[0m"
白色背景上的红色文本示例
printf "\033[91m\033[107mThis is red text on a white background\033[0m"
这有点麻烦,所以我创建了一些简单的子例程,它们提供了以更文明的方式输出文本的方法
辅助函数
以下辅助函数允许您执行以下操作
WriteLine "This is red text" "Red"
WriteLine "This is red text on a white background" "Red" "White"
容易得多。
useColor="true" # Set to false if you find your environment just doesn't handle colors well
# Returns a color code for the given foreground/background colors
# This code is echoed to the terminal before outputing text in
# order to generate a colored output.
#
# string foreground color name. Optional if no background provided.
# Defaults to "Default" which uses the system default
# string background color name. Optional. Defaults to $color_background
# which is set based on the current terminal background
# returns a string
function Color () {
local foreground=$1
local background=$2
if [ "$foreground" == "" ]; then foreground="Default"; fi
if [ "$background" == "" ]; then background="$color_background"; fi
local colorString='\033['
# Foreground Colours
case "$foreground" in
"Default") colorString='\033[0;39m';;
"Black" ) colorString='\033[0;30m';;
"DarkRed" ) colorString='\033[0;31m';;
"DarkGreen" ) colorString='\033[0;32m';;
"DarkYellow" ) colorString='\033[0;33m';;
"DarkBlue" ) colorString='\033[0;34m';;
"DarkMagenta" ) colorString='\033[0;35m';;
"DarkCyan" ) colorString='\033[0;36m';;
"Gray" ) colorString='\033[0;37m';;
"DarkGray" ) colorString='\033[1;90m';;
"Red" ) colorString='\033[1;91m';;
"Green" ) colorString='\033[1;92m';;
"Yellow" ) colorString='\033[1;93m';;
"Blue" ) colorString='\033[1;94m';;
"Magenta" ) colorString='\033[1;95m';;
"Cyan" ) colorString='\033[1;96m';;
"White" ) colorString='\033[1;97m';;
*) colorString='\033[0;39m';;
esac
# Background Colours
case "$background" in
"Default" ) colorString="${colorString}\033[49m";;
"Black" ) colorString="${colorString}\033[40m";;
"DarkRed" ) colorString="${colorString}\033[41m";;
"DarkGreen" ) colorString="${colorString}\033[42m";;
"DarkYellow" ) colorString="${colorString}\033[43m";;
"DarkBlue" ) colorString="${colorString}\033[44m";;
"DarkMagenta" ) colorString="${colorString}\033[45m";;
"DarkCyan" ) colorString="${colorString}\033[46m";;
"Gray" ) colorString="${colorString}\033[47m";;
"DarkGray" ) colorString="${colorString}\033[100m";;
"Red" ) colorString="${colorString}\033[101m";;
"Green" ) colorString="${colorString}\033[102m";;
"Yellow" ) colorString="${colorString}\033[103m";;
"Blue" ) colorString="${colorString}\033[104m";;
"Magenta" ) colorString="${colorString}\033[105m";;
"Cyan" ) colorString="${colorString}\033[106m";;
"White" ) colorString="${colorString}\033[107m";;
*) colorString="${colorString}\033[49m";;
esac
echo "${colorString}"
}
# Outputs a line, including linefeed, to the terminal using the given foreground / background
# colors
#
# string The text to output. Optional if no foreground provided. Default is just a line feed.
# string Foreground color name. Optional if no background provided. Defaults to "Default" which
# uses the system default
# string Background color name. Optional. Defaults to $color_background which is set based on the
# current terminal background
function WriteLine () {
local resetColor='\033[0m'
local str=$1
local forecolor=$2
local backcolor=$3
if [ "$str" == "" ]; then
printf "\n"
return;
fi
# Note the use of the format placeholder %s. This allows us to pass "--" as strings without error
if [ "$useColor" == "true" ]; then
local colorString=$(Color ${forecolor} ${backcolor})
printf "${colorString}%s${resetColor}\n" "${str}"
else
printf "%s\n" "${str}"
fi
}
# Outputs a line without a linefeed to the terminal using the given foreground / background colors
#
# string The text to output. Optional if no foreground provided. Default is just a line feed.
# string Foreground color name. Optional if no background provided. Defaults to "Default" which
# uses the system default
# string Background color name. Optional. Defaults to $color_background which is set based on the
# current terminal background
function Write () {
local resetColor="\033[0m"
local forecolor=$1
local backcolor=$2
local str=$3
if [ "$str" == "" ]; then
return;
fi
# Note the use of the format placeholder %s. This allows us to pass "--" as strings without error
if [ "$useColor" == "true" ]; then
local colorString=$(Color ${forecolor} ${backcolor})
printf "${colorString}%s${resetColor}" "${str}"
else
printf "%s" "$str"
fi
}
处理暗模式和亮模式
在许多Linux和Unix发行版中,终端是黑色背景,白色文本。在macOS上,默认为带有黑色文本的白色背景。有很多方法 可以测试和猜测发生了什么,但最终你需要在你的系统上进行测试并决定什么对你有用。
我所做的是假设如果我们在Mac上,那么我们可以直接测试,否则我们假设黑底白字。然后我也尝试坚持使用默认颜色,在我想要一点颜色的地方,我会坚持一些我知道在任何地方都能很好地工作的预定义颜色。
# Gets the terminal background color. It's a very naive guess
# returns an RGB triplet, values from 0 - 64K
function getBackground () {
if [[ $OSTYPE == 'darwin'* ]]; then
osascript -e \
'tell application "Terminal"
get background color of selected tab of window 1
end tell'
else
# See https://github.com/rocky/shell-term-background/blob/master/term-background.bash
# for a comprehensive way to test for background colour. For now we're just going to
# assume that non-macOS terminals have a black background.
echo "0,0,0" # we're making assumptions here
fi
}
# Determines whether or not the current terminal is in dark mode (dark background, light text)
# returns "true" if running in dark mode; false otherwise
function isDarkMode () {
local bgColor=$(getBackground)
IFS=','; colors=($bgColor); IFS=' ';
# Is the background more or less dark?
if [ ${colors[0]} -lt 20000 ] && [ ${colors[1]} -lt 20000 ] && [ ${colors[2]} -lt 20000 ]; then
echo "true"
else
echo "false"
fi
}
一旦我们对我们正在处理的事情有了一个大致的了解,我会做:
darkmode=$(isDarkMode)
# Setup some predefined colours. Note that we can't reliably determine the background
# color of the terminal so we avoid specifically setting black or white for the foreground
# or background. You can always just use "White" and "Black" if you specifically want
# this combo, but test thoroughly
if [ "$darkmode" == "true" ]; then
color_primary="Blue"
color_mute="Gray"
color_info="Yellow"
color_success="Green"
color_warn="DarkYellow"
color_error="Red"
else
color_primary="DarkBlue"
color_mute="Gray"
color_info="Magenta"
color_success="DarkGreen"
color_warn="DarkYellow"
color_error="Red"
fi
并使用这些:
WriteLine "Predefined colors on default background"
WriteLine
WriteLine "Default colored text" "Default"
WriteLine "Primary colored text" $color_primary
WriteLine "Mute colored text" $color_mute
WriteLine "Info colored text" $color_info
WriteLine "Success colored text" $color_success
WriteLine "Warning colored text" $color_warn
WriteLine "Error colored text" $color_error
WriteLine
WriteLine "Default color on predefined background"
WriteLine
WriteLine "Default colored background" "Default"
WriteLine "Primary colored background" "Default" $color_primary
WriteLine "Mute colored background" "Default" $color_mute
WriteLine "Info colored background" "Default" $color_info
WriteLine "Success colored background" "Default" $color_success
WriteLine "Warning colored background" "Default" $color_warn
WriteLine "Error colored background" "Default" $color_error
在经典的Linux终端上
在macOS终端上
事情有点模糊,所以让我们再添加一个函数,它将在我们选择的任何背景上提供对比鲜明的前景
# Returns the name of a color that will providing a contrasting foreground
# color for the given background color. This function assumes $darkmode has
# been set globally.
#
# string background color name.
# returns a string representing a contrasting foreground colour name
function ContrastForeground () {
local color=$1
if [ "$color" == "" ]; then color="Default"; fi
if [ "$darkmode" == "true" ]; then
case "$color" in
"Default" ) echo "White";;
"Black" ) echo "White";;
"DarkRed" ) echo "White";;
"DarkGreen" ) echo "White";;
"DarkYellow" ) echo "White";;
"DarkBlue" ) echo "White";;
"DarkMagenta" ) echo "White";;
"DarkCyan" ) echo "White";;
"Gray" ) echo "Black";;
"DarkGray" ) echo "White";;
"Red" ) echo "White";;
"Green" ) echo "White";;
"Yellow" ) echo "Black";;
"Blue" ) echo "White";;
"Magenta" ) echo "White";;
"Cyan" ) echo "Black";;
"White" ) echo "Black";;
*) echo "White";;
esac
else
case "$color" in
"Default" ) echo "Black";;
"Black" ) echo "White";;
"DarkRed" ) echo "White";;
"DarkGreen" ) echo "White";;
"DarkYellow" ) echo "White";;
"DarkBlue" ) echo "White";;
"DarkMagenta" ) echo "White";;
"DarkCyan" ) echo "White";;
"Gray" ) echo "Black";;
"DarkGray" ) echo "White";;
"Red" ) echo "White";;
"Green" ) echo "Black";;
"Yellow" ) echo "Black";;
"Blue" ) echo "White";;
"Magenta" ) echo "White";;
"Cyan" ) echo "Black";;
"White" ) echo "Black";;
*) echo "White";;
esac
fi
echo "${colorString}"
}
然后,在Color子程序中,我们可以做到
function Color () {
local foreground=$1
local background=$2
if [ "$foreground" == "" ]; then foreground="Default"; fi
if [ "$background" == "" ]; then background="$color_background"; fi
if [ "$foreground" == "Contrast" ]; then
foreground=$(ContrastForeground ${background})
fi
...
为了使我们的文本与背景颜色更清晰一点,我们这样做
WriteLine
WriteLine "Default contrasting color on predefined background"
WriteLine
WriteLine "Primary colored background" "Contrast" $color_primary
WriteLine "Mute colored background" "Contrast" $color_mute
WriteLine "Info colored background" "Contrast" $color_info
WriteLine "Success colored background" "Contrast" $color_success
WriteLine "Warning colored background" "Contrast" $color_warn
WriteLine "Error colored background" "Contrast" $color_error
Linux终端上的结果
...在macOS终端上
https://www.codeproject.com/Articles/5329247/How-to-change-text-color-in-a-Linux-terminal
更多推荐
所有评论(0)