![如何备份和恢复当前的显示颜色和格式?](https://linux22.com/image/166404/%E5%A6%82%E4%BD%95%E5%A4%87%E4%BB%BD%E5%92%8C%E6%81%A2%E5%A4%8D%E5%BD%93%E5%89%8D%E7%9A%84%E6%98%BE%E7%A4%BA%E9%A2%9C%E8%89%B2%E5%92%8C%E6%A0%BC%E5%BC%8F%EF%BC%9F.png)
有没有办法备份当前的显示颜色和格式,以便我可以回显一些自定义颜色,然后将其重置回之前的状态?
例如:
echo -e '\e[31m'123; echo 456
这也会颜色123
为红色456
。
我可以轻松地重置显示颜色和格式,如下所示:
echo -e '\e[31m'123'\033[0m'; echo 456
但我不想重置而是显示恢复它是我改变之前的样子。
这是一个问题,我想在一个较大的字符串中的某个位置回显任意字符串。但我提供的重置输出的示例假设没有现有的格式。
我的 shell 环境是 Bash,我使用的是 xterm-256color 兼容的终端模拟器
答案1
对于所示的(ANSI 兼容)示例,
tput op
如果您使用 256 色功能来更改调色板,此额外步骤将有所帮助:
tput oc
前者指的是颜色对(curses 应用程序的一个功能,为此编写了这些终端描述:bash 不参与该活动,但可以使用结果)。后者指的是原始颜色(更改调色板之前)。
在终端描述中,这些是由构建块提供的,例如,xterm+256color
:
xterm+256color|xterm 256-color feature,
ccc,
colors#0x100, pairs#0x10000,
initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*
%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\,
oc=\E]104\007,
setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;
5;%p1%d%;m,
setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5
;%p1%d%;m,
setb@, setf@,
xterm-basic|modern xterm terminal emulator - common,
OTbs, am, bce, km, mir, msgr, xenl, AX, XT,
colors#8, cols#80, it#8, lines#24, pairs#64,
acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=\r,
csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H,
hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
il=\E[%p1%dL, il1=\E[L, ind=\n, invis=\E[8m,
is2=\E[!p\E[?3;4l\E[4l\E>, kmous=\E[M, meml=\El,
memu=\Em, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM,
rmacs=\E(B, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>,
rmm=\E[?1034l, rmso=\E[27m, rmul=\E[24m, rs1=\Ec,
rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, setab=\E[4%p1%dm,
setaf=\E[3%p1%dm,
setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
%=%t3%e%p1%d%;m,
setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}
%=%t3%e%p1%d%;m,
sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;
%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
sgr0=\E(B\E[m, smacs=\E(0, smam=\E[?7h, smir=\E[4h,
smkx=\E[?1h\E=, smm=\E[?1034h, smso=\E[7m, smul=\E[4m,
tbc=\E[3g, vpa=\E[%i%p1%dd, E3=\E[3J, use=ecma+italics,
use=ansi+pp, use=xterm+kbs, use=xterm+alt+title,
use=ansi+enq,
这是相当长的。颜色特征可以被分成一个新的构建块,例如 ,xterm+color
但目前还没有必要这样做。如果您使用 xterm“兼容”终端,它有一个不同的、更合适的终端描述,如ncurses 常见问题解答。其中大部分最终源自klone+color
。
如果您想保存颜色设置,可以编写脚本来获取此信息。有几个示例脚本在xterm
来源中。其中一些与 xterm“兼容”终端一起使用。如果我要演示“ANSI 兼容”颜色的查询功能,我会使用dynamic.sh
(ymmv:某些终端与其他终端的 xterm 兼容性较差)。
答案2
将其保存在变量中。
red='\e[31m'
reset='\033[0m'
printf '%b %b' "$red"123 "$reset"456