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
上提交命令并清除屏幕,则背景颜色将应用于全屏,但仅在提交另一个命令之前持续存在。[...]
¹背景色
要将背景设置为颜色 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 在虚拟终端之间来回切换。
这将背景设置为浅绿色而无需清除屏幕:
printf %b '\e]11;#ccffcc\a'
Run Code Online (Sandbox Code Playgroud)
这也适用于细mlterm
,rxvt
,gnome-terminal
,konsole
等。
不支持替代形式\e]11;rgb:cc/ff/cc\a
(取自此处)konsole
(使用 12.16.0 版本进行测试)。
这会不会在里面工作tmux
或screen
。
的所有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