V lidovém ‘.*rc
‘ soubory, které vidím online nebo v různém kódu, mám tendenci vidět mnoho lidí, kteří ručně používají escape sekvence ANSI namísto použití tput
.
Pochopil jsem, že tput
je univerzálnější/bezpečnější, takže mě to zajímá:
Existuje nějaký objektivní důvod, proč bychom měli místo tput
používat escape sekvence ? (Přenositelnost, odolnost proti chybám, neobvyklé terminály…?)
Přijatá odpověď:
tput
dokáže zpracovat výrazy (například v sgr
a setaf
), které by typický shell-scripter považoval za méně než použitelné. Chcete-li získat představu o tom, co to obnáší, podívejte se na výstup z infocmp
pomocí -f
byla použita možnost (formátování). Zde je jeden z příkladů použití těchto řetězců z popisů terminfo xterm:
xterm-16color|xterm with 16 colors,
colors#16,
pairs#256,
setab=E[
%?
%p1%{8}%<
%t%p1%{40}%+
%e
%p1%{92}%+
%;%dm,
setaf=E[
%?
%p1%{8}%<
%t%p1%{30}%+
%e
%p1%{82}%+
%;%dm,
setb=
%p1%{8}%/%{6}%*%{4}%+E[%d%p1%{8}%m%Pa
%?%ga%{1}%=
%t4
%e%ga%{3}%=
%t6
%e%ga%{4}%=
%t1
%e%ga%{6}%=
%t3
%e%ga%d
%;
m,
setf=
%p1%{8}%/%{6}%*%{3}%+E[%d%p1%{8}%m%Pa
%?%ga%{1}%=
%t4
%e%ga%{3}%=
%t6
%e%ga%{4}%=
%t1
%e%ga%{6}%=
%t3
%e%ga%d
%;
m,
use=xterm+256color,
use=xterm-new,
Formátování věci rozděluje – skript nebo program, který by udělal totéž, by musel tyto zvraty sledovat. Většina lidí to vzdá a použije ty nejjednodušší řetězce.
Funkce 16 barev je vypůjčena od IBM aixterm, která mapuje 16 kódů pro popředí a pozadí do dvou rozsahů;
- v popředí na 30-37 a 90-97
- pozadí na 40-47 a 100-107
Jednoduchý skript
#!/bin/sh
TERM=xterm-16color
export TERM
printf ' %12s %12sn' Foreground Background
for n in $(seq 0 15)
do
F=$(tput setaf $n | cat -v)
B=$(tput setab $n | cat -v)
printf '%2d %12s %12sn' $n "$F" "$B"
done
a výstup ukazují, jak to funguje:
Foreground Background
0 ^[[30m ^[[40m
1 ^[[31m ^[[41m
2 ^[[32m ^[[42m
3 ^[[33m ^[[43m
4 ^[[34m ^[[44m
5 ^[[35m ^[[45m
6 ^[[36m ^[[46m
7 ^[[37m ^[[47m
8 ^[[90m ^[[100m
9 ^[[91m ^[[101m
10 ^[[92m ^[[102m
11 ^[[93m ^[[103m
12 ^[[94m ^[[104m
13 ^[[95m ^[[105m
14 ^[[96m ^[[106m
15 ^[[97m ^[[107m
Čísla jsou rozdělena, protože aixterm používá rozsahy 30-37 a 40-47, aby odpovídaly barvám ECMA-48 (také známé jako „ANSI“), a pro kódy ne používá rozsah 90-107 definované ve standardu.
Zde je snímek obrazovky s xterm pomocí TERM=xterm-16color
, kde můžete vidět efekt.
Další čtení:
infocmp
– porovnejte nebo vytiskněte popisy terminfotput
,reset
– inicializovat terminálovou nebo dotazovací databázi terminfo- ECMA-48:Ovládací funkce pro kódované znakové sady
aixterm
Příkaz- Nejsou světlé barvy to samé jako tučné? (Nejčastější dotazy k XTerm)