Nelle persone '.*rc
' file che vedo online o in vari codici, tendo a vedere molte persone che usano manualmente sequenze di escape ANSI invece di usare tput
.
Ho capito che tput
è più universale/sicuro, quindi questo mi fa pensare:
C'è qualche ragione oggettiva per cui si dovrebbero usare sequenze di escape al posto di tput
? (Portabilità, robustezza agli errori, terminali insoliti…?)
Risposta accettata:
tput
può gestire espressioni (ad esempio in sgr
e setaf
) che il tipico scripter di shell troverebbe meno che utilizzabile. Per avere un'idea di ciò che è coinvolto, vedere l'output da infocmp
con il -f
opzione (formattazione) applicata. Ecco uno degli esempi che utilizzano quelle stringhe dalle descrizioni terminfo di 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,
La formattazione divide le cose:uno script o un programma per fare lo stesso dovrebbe seguire quei colpi di scena. La maggior parte delle persone si arrende e usa solo le corde più facili.
La funzione a 16 colori è presa in prestito da IBM aixterm, che mappa 16 codici ciascuno per il primo piano e lo sfondo su due intervalli;
- in primo piano su 30-37 e 90-97
- sfondo su 40-47 e 100-107
Un semplice script
#!/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
e l'output mostra come funziona:
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
I numeri sono suddivisi perché aixterm utilizza gli intervalli 30-37 e 40-47 per abbinare i colori ECMA-48 (noti anche come "ANSI") e utilizza l'intervallo 90-107 per i codici non definito nella norma.
Ecco uno screenshot con xterm usando TERM=xterm-16color
, dove puoi vedere l'effetto.
Ulteriori letture:
infocmp
– confronta o stampa le descrizioni di terminfotput
,reset
– inizializzare un terminale o interrogare un database terminfo- ECMA-48:funzioni di controllo per set di caratteri codificati
aixterm
Comando- I colori accesi non sono uguali a quelli audaci? (FAQ XTerm)