In „.*rc
der Leute ‘-Dateien, die ich online oder in verschiedenen Codes sehe, sehe ich viele Leute, die ANSI-Escape-Sequenzen manuell verwenden, anstatt tput
zu verwenden .
Ich hatte das Verständnis, dass tput
ist universeller/sicherer, also frage ich mich:
Gibt es einen objektiven Grund, warum man Escape-Sequenzen anstelle von tput
verwenden sollte? ? (Portabilität, Robustheit gegenüber Fehlern, ungewöhnliche Endgeräte…?)
Akzeptierte Antwort:
tput
kann mit Ausdrücken umgehen (zum Beispiel in sgr
und setaf
), die der typische Shell-Scripter nicht brauchbar finden würde. Sehen Sie sich die Ausgabe von infocmp
an, um eine Vorstellung davon zu bekommen, worum es geht mit dem -f
(Formatierungs-)Option angewendet. Hier ist eines der Beispiele, die diese Zeichenfolgen aus den terminfo-Beschreibungen von xterm verwenden:
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,
Die Formatierung teilt die Dinge auf – ein Skript oder Programm, das dasselbe tut, müsste diesen Drehungen und Wendungen folgen. Die meisten Leute geben auf und verwenden einfach die einfachsten Saiten.
Die 16-Farben-Funktion ist von IBM aixterm entlehnt, das jeweils 16 Codes für Vorder- und Hintergrund auf zwei Bereiche abbildet;
- Vordergrund auf 30-37 und 90-97
- Hintergrund auf 40-47 und 100-107
Ein einfaches 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
und Ausgabe zeigen, wie es funktioniert:
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
Die Nummern sind aufgeteilt, weil aixterm die Bereiche 30–37 und 40–47 verwendet, um ECMA-48-Farben (auch bekannt als „ANSI“) abzugleichen, und den Bereich 90–107 für Codes nicht verwendet im Standard definiert.
Hier ist ein Screenshot mit xterm unter Verwendung von TERM=xterm-16color
, wo Sie den Effekt sehen können.
Weiterführende Literatur:
infocmp
– termininfo-Beschreibungen vergleichen oder ausdruckentput
,reset
– ein Terminal initialisieren oder Termininfo-Datenbank abfragen- ECMA-48:Kontrollfunktionen für codierte Zeichensätze
aixterm
Befehl- Sind helle Farben nicht dasselbe wie kräftig? (XTerm-FAQ)