En el ‘.*rc
de las personas ‘ archivos que veo en línea o en varios códigos, tiendo a ver a muchas personas que usan manualmente secuencias de escape ANSI en lugar de usar tput
.
Tuve el entendimiento de que tput
es más universal/seguro, por lo que me pregunto:
¿Hay alguna razón objetiva para usar secuencias de escape en lugar de tput
? ? (Portabilidad, robustez ante errores, terminales inusuales…?)
Respuesta aceptada:
tput
puede manejar expresiones (por ejemplo en sgr
y setaf
) que el shell-scripter típico encontraría menos que utilizable. Para tener una idea de lo que está involucrado, vea el resultado de infocmp
con el -f
(formato) opción aplicada. Este es uno de los ejemplos que usan esas cadenas de las descripciones terminfo de 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,
El formato divide las cosas:un guión o programa para hacer lo mismo tendría que seguir esos giros y vueltas. La mayoría de las personas se dan por vencidas y solo usan las cadenas más fáciles.
La característica de 16 colores se tomó prestada de IBM aixterm, que mapea 16 códigos cada uno para el primer plano y el fondo en dos rangos;
- primer plano en 30-37 y 90-97
- fondo en 40-47 y 100-107
Un guión sencillo
#!/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
y la salida muestra cómo funciona:
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
Los números están divididos porque aixterm usa los rangos 30-37 y 40-47 para hacer coincidir los colores ECMA-48 (también conocido como "ANSI") y usa el rango 90-107 para los códigos no definido en el estándar.
Aquí hay una captura de pantalla con xterm usando TERM=xterm-16color
, donde puedes ver el efecto.
Lectura adicional:
infocmp
– comparar o imprimir descripciones terminfotput
,reset
– inicializar un terminal o consultar la base de datos terminfo- ECMA-48:Funciones de control para conjuntos de caracteres codificados
aixterm
Comando- ¿Los colores brillantes no son lo mismo que los llamativos? (Preguntas frecuentes sobre XTerm)