我正在尝试使用echo命令在终端中打印文本。

我想用红色打印文本。我该怎么做?


当前回答

以下是我最终使用sed的结果

echo " [timestamp] production.FATAL Some Message\n" \
"[timestamp] production.ERROR Some Message\n" \
"[timestamp] production.WARNING Some Message\n" \
"[timestamp] production.INFO Some Message\n" \
"[timestamp] production.DEBUG Some Message\n"  | sed \
-e "s/FATAL/"$'\e[31m'"&"$'\e[m'"/" \
-e "s/ERROR/"$'\e[31m'"&"$'\e[m'"/" \
-e "s/WARNING/"$'\e[33m'"&"$'\e[m'"/" \
-e "s/INFO/"$'\e[32m'"&"$'\e[m'"/" \
-e "s/DEBUG/"$'\e[34m'"&"$'\e[m'"/"

打印方式如下:

其他回答

以下是我最终使用sed的结果

echo " [timestamp] production.FATAL Some Message\n" \
"[timestamp] production.ERROR Some Message\n" \
"[timestamp] production.WARNING Some Message\n" \
"[timestamp] production.INFO Some Message\n" \
"[timestamp] production.DEBUG Some Message\n"  | sed \
-e "s/FATAL/"$'\e[31m'"&"$'\e[m'"/" \
-e "s/ERROR/"$'\e[31m'"&"$'\e[m'"/" \
-e "s/WARNING/"$'\e[33m'"&"$'\e[m'"/" \
-e "s/INFO/"$'\e[32m'"&"$'\e[m'"/" \
-e "s/DEBUG/"$'\e[34m'"&"$'\e[m'"/"

打印方式如下:

我写了swag就是为了实现这一点。

你可以这样做

pip install swag

现在,您可以通过以下方式将所有转义命令作为txt文件安装到给定目标:

swag install -d <colorsdir>

或者更容易通过:

swag install

这将把颜色安装到~/.colors。

您可以这样使用它们:

echo $(cat ~/.colors/blue.txt) This will be blue

或者这样,我觉得更有趣:

swag print -c red -t underline "I will turn red and be underlined"

在ascinema上查看!

您可以使用很棒的tput命令(在Ignacio的回答中建议)来为各种事情生成终端控制代码。


用法

稍后将讨论特定的tput子命令。

直接的

作为命令序列的一部分调用tput:

tput setaf 1; echo "this is red text"

使用而不是&&所以如果tput出错,文本仍然显示。

Shell变量

另一个选项是使用shell变量:

red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
echo "${red}red text ${green}green text${reset}"

tput产生的字符序列被终端解释为具有特殊含义。他们不会被展示出来。请注意,它们仍然可以保存到文件中,或由终端以外的程序作为输入进行处理。

命令替换

使用命令替换将tput的输出直接插入回显字符串可能更方便:

echo "$(tput setaf 1)Red text $(tput setab 7)and white background$(tput sgr 0)"

实例

上面的命令在Ubuntu上产生这个:


前景和背景颜色命令

tput setab [1-7] # Set the background colour using ANSI escape
tput setaf [1-7] # Set the foreground colour using ANSI escape

颜色如下:

Num  Colour    #define         R G B

0    black     COLOR_BLACK     0,0,0
1    red       COLOR_RED       1,0,0
2    green     COLOR_GREEN     0,1,0
3    yellow    COLOR_YELLOW    1,1,0
4    blue      COLOR_BLUE      0,0,1
5    magenta   COLOR_MAGENTA   1,0,1
6    cyan      COLOR_CYAN      0,1,1
7    white     COLOR_WHITE     1,1,1

也有非ANSI版本的颜色设置函数(setb而不是setab,setf而不是setaf)使用不同的数字,这里没有给出。

文本模式命令

tput bold    # Select bold mode
tput dim     # Select dim (half-bright) mode
tput smul    # Enable underline mode
tput rmul    # Disable underline mode
tput rev     # Turn on reverse video mode
tput smso    # Enter standout (bold) mode
tput rmso    # Exit standout mode

光标移动命令

tput cup Y X # Move cursor to screen postion X,Y (top left is 0,0)
tput cuf N   # Move N characters forward (right)
tput cub N   # Move N characters back (left)
tput cuu N   # Move N lines up
tput ll      # Move to last line, first column (if no cup)
tput sc      # Save the cursor position
tput rc      # Restore the cursor position
tput lines   # Output the number of lines of the terminal
tput cols    # Output the number of columns of the terminal

清除和插入命令

tput ech N   # Erase N characters
tput clear   # Clear screen and move the cursor to 0,0
tput el 1    # Clear to beginning of line
tput el      # Clear to end of line
tput ed      # Clear to end of screen
tput ich N   # Insert N characters (moves rest of line forward!)
tput il N    # Insert N lines

其他命令

tput sgr0    # Reset text format to the terminal's default
tput bel     # Play a bell

对于compiz摇摆窗口,bel命令使终端摇摆一秒钟以吸引用户的注意力。


脚本

tput接受每行包含一个命令的脚本,这些脚本在tput退出之前按顺序执行。

通过回显多行字符串和管道来避免临时文件:

echo -e "setf 7\nsetb 1" | tput -S  # set fg white and bg red

另请参见

见man 1 tput有关命令的完整列表以及有关这些选项的更多详细信息,请参阅man 5 terminfo。(相应的tput命令列在从第81行开始的巨大表的Cap-name列中。)

这里有一个简单的脚本,可以轻松管理bashshellpromt中的文本样式:

https://github.com/ferromauro/bash-palette

使用以下方法导入代码:

source bash-palette.sh

在echo命令中使用导入的变量(使用-e选项!):

echo -e ${PALETTE_GREEN}Color Green${PALETTE_RESET}

可以组合更多元素:

echo -e ${PALETTE_GREEN}${PALETTE_BLINK}${PALETTE_RED_U}Green Blinking Text over Red Background${PALETTE_RESET}

我应该使用tput,而不是硬编码特定于当前终端的转义码。

这是我最喜欢的演示脚本:

#!/bin/bash

tput init

end=$(( $(tput colors)-1 ))
w=8
for c in $(seq 0 $end); do
    eval "$(printf "tput setaf %3s   " "$c")"; echo -n "$_"
    [[ $c -ge $(( w*2 )) ]] && offset=2 || offset=0
    [[ $(((c+offset) % (w-offset))) -eq $(((w-offset)-1)) ]] && echo
done

tput init