如何设置Linux控制台屏幕的背景色?

2 linux scripting terminal-emulator tput terminfo

注意:我重新编写了问题以澄清问题。这是一个微不足道的问题,可以分为几个部分来回答,因为这个问题有几个属性。

不幸的是,当提出问题的人理解(知道)答案的某些部分以及问题的结构时,问题可能会被重新设计。

因此,问题是从与原始问题不同的角度提出的。

如何使用 shell 实用程序更改 Linux 控制台的颜色设置¹? 如何使用 shell 实用程序更改终​​端仿真器的颜色设置¹?

本来,我想在执行shell脚本的过程中改变Linux控制台的背景颜色。以下命题如我所愿。

#!/bin/sh

# set the background color of the terminal
tput setab 6
clear

printf "%s\n" 'background: cyan'

# do some tasks 
cd /usr/src/initramfs
pwd
ls -l

# the background of the shell output is cyan
Run Code Online (Sandbox Code Playgroud)

尽管如此,有人可能会遇到几个小故障(或困难)。

例如,如果屏幕未被清除,则在 shell 脚本执行期间,背景颜色仅应用于文本输出。如果tput setab 6使用命令行提交命令并且没有清除屏幕,则背景颜色仅应用于输出文本的一小部分。如果在命令行tput setab 6上提交命令并清除屏幕,则背景颜色将应用于全屏,但仅在提交另一个命令之前持续存在。[...]

¹背景色

mos*_*svy 8

在 linux 虚拟终端(“控制台”)上:

要将背景设置为颜色 1(红色):

printf %b '\e[41m' '\e[8]' '\e[H\e[J'
Run Code Online (Sandbox Code Playgroud)

第一个转义 ( setab) 将背景设置为颜色 1,第二个转义将当前前景-背景对定义为默认值,第三个 ( clear) 清除屏幕。

从现在开始,“红色”将成为默认背景:

printf %b 'World\e[42mWide\e[mWeb\n'
Run Code Online (Sandbox Code Playgroud)

请注意背景如何设置到绿色的setab 2\e[42),并与属性的后续结算sgr0\e[m)不要擦去我们的设置。

或者,您可以通过“设置调色板”(又名initc=“initialize_color”)转义重新定义颜色 0(默认背景,黑色)的含义:

printf %b '\e[40m' '\e[8]' # set default background to color 0 (black)
printf %b '\e]P0ff0000'    # redefine color 0 as 'red'
Run Code Online (Sandbox Code Playgroud)

后者采用形式为 的参数nRRGGBB,其中n是颜色编号,并且RRGGBB是定义颜色的十六进制三元组。

putty也支持这种转义。

有关这些功能的说明及更多信息,请查看 console_codes(4) 和 terminfo(5) 联机帮助页。

我也不能:

a) 更改屏幕的背景颜色,而无需使用 擦除屏幕上的所有内容clear

b) 强制它更新屏幕的非字符边距,而无需使用 Control-Alt-Fn 在虚拟终端之间来回切换。

在类似 xterm 的终端模拟器上:

这将背景设置为浅绿色无需清除屏幕:

printf %b '\e]11;#ccffcc\a'
Run Code Online (Sandbox Code Playgroud)

这也适用于细mltermrxvtgnome-terminalkonsole等。

不支持替代形式\e]11;rgb:cc/ff/cc\a(取自此处konsole(使用 12.16.0 版本进行测试)。

这会不会在里面工作tmuxscreen

的所有xterm转义都记录在其源代码的ctlseqs.txt文件中。

笔记:

一些转义(例如\e[8]\e]11;...\a)不包含在 terminfo 中,根本不能使用tput,而其他转义(例如initc)太笨拙而无法以干净的方式使用。

可以通过如下命令获取 terminfo 数据库的 grepable 版本: find /usr/share/terminfo -type f -printf '%f\n' | xargs -n1 infocmp -0 -A /usr/share/terminfo