Dans le ‘.*rc
des personnes ' que je vois en ligne ou dans divers codes, j'ai tendance à voir beaucoup de gens qui utilisent manuellement les séquences d'échappement ANSI au lieu d'utiliser tput
.
J'ai compris que tput
est plus universel/sûr, donc cela me fait me demander :
Existe-t-il une raison objective pour utiliser des séquences d'échappement à la place de tput
? (Portabilité, robustesse sur les erreurs, terminaux inhabituels… ?)
Réponse acceptée :
tput
peut gérer des expressions (par exemple dans sgr
et setaf
) que le shell-scripter typique trouverait moins utilisable. Pour avoir une idée de ce qui est impliqué, consultez la sortie de infocmp
avec le -f
(formatage) option appliquée. Voici l'un des exemples utilisant ces chaînes à partir des descriptions 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,
Le formatage divise les choses - un script ou un programme pour faire la même chose devrait suivre ces rebondissements. La plupart des gens abandonnent et utilisent simplement les chaînes les plus simples.
La fonctionnalité 16 couleurs est empruntée à IBM aixterm, qui mappe 16 codes chacun pour le premier plan et l'arrière-plan sur deux plages ;
- premier plan sur 30-37 et 90-97
- arrière-plan sur 40-47 et 100-107
Un script simple
#!/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
et la sortie montrent comment cela fonctionne :
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
Les nombres sont divisés car aixterm utilise les plages 30-37 et 40-47 pour correspondre aux couleurs ECMA-48 (également appelées "ANSI"), et utilise la plage 90-107 pour les codes pas défini dans la norme.
Voici une capture d'écran avec xterm en utilisant TERM=xterm-16color
, où vous pouvez voir l'effet.
Lectures complémentaires :
infocmp
– comparer ou imprimer les descriptions terminfotput
,reset
– initialiser un terminal ou interroger la base de données terminfo- ECMA-48 :Fonctions de contrôle pour les jeux de caractères codés
aixterm
Commande- Les couleurs vives ne sont-elles pas identiques aux couleurs vives ? (FAQ XTerm)