Dans les .*rc
fichiers des gens 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 de les utiliser tput
.
J'ai compris que tput
c'était plus universel / sûr, donc cela me fait me demander:
Y a-t-il une raison objective d'utiliser des séquences d'échappement à la place de tput
? (Portabilité, robustesse aux erreurs, terminaux inhabituels ...?)
terminal
escape-characters
tput
Captain Man
la source
la source
printf
les séquences d'échappement ANSI, maistput
échouera (au moins sur ma boîte).Réponses:
tput
peut gérer des expressions (par exemple danssgr
etsetaf
) que le shell-scripteur typique trouverait moins qu'utilisable. Pour avoir une idée de ce qui est impliqué, voir la sortie deinfocmp
avec l'-f
option (formatage) appliquée. Voici un exemple d'utilisation de ces chaînes à partir des descriptions terminfo de xterm :Le formatage divise les choses - un script ou un programme pour faire de même devrait suivre ces rebondissements. La plupart des gens abandonnent et utilisent simplement les cordes les plus faciles.
La fonction 16 couleurs est empruntée à IBM aixterm, qui mappe 16 codes chacun pour le premier plan et l'arrière-plan sur deux plages;
Un script simple
et la sortie montre comment cela fonctionne:
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 non définis dans la norme.
Voici une capture d'écran avec xterm using
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 une base de données terminfoaixterm
Commanderla source
Venant d'une époque où les plates-formes UNIX pouvaient avoir une variété de périphériques attachés, je préfère de loin tput et ses amis aux séquences d'échappement littérales.
Je pense que la vraie raison est que la plupart des gens ne connaissent tout simplement pas les fichiers / bibliothèques
tput
associés .terminfo
termcap
la source
L'une des raisons est qu'il
tput
s'agit de la commande externe, elle peut donc s'exécuter plus lentement que les codes d'échappement shell intégrés. Une autre chose est que l'on peut facilement créer un liners combinant des codes d'échappement ANSI avec des caractères d'échappement spécifiques au shell, comme dansbash
invite par exemple:de même dans
zsh
:Ici, tout est clair et compact. Avec
tput
un, il faudrait le diviser en plusieurs lignes ou le rendre beaucoup plus long et complexe, en l'exécutanttput
plusieurs fois, etc.la source
PS1="$(tput setaf 2)\u@\h$(tput reset) >
$(tput sgr0)
pour la fin, mais convenir que tput est une amélioration.