Gibt es einen objektiven Vorteil, Sequenzen über tput zu entkommen?

10

In den .*rcDateien von Personen, die ich online oder in verschiedenen Codes sehe, sehe ich häufig viele Personen, die ANSI-Escape-Sequenzen manuell verwenden, anstatt sie zu verwenden tput.

Ich hatte das Verständnis, tputdas universeller / sicherer ist, daher wundere ich mich:

Gibt es einen objektiven Grund, warum man Escape-Sequenzen anstelle von verwenden sollte tput? (Portabilität, Robustheit bei Fehlern, ungewöhnliche Terminals ...?)

Captain Man
quelle
Auf der anderen Seite der Portabilitätsfrage funktioniert MobaXterm mit printfund ANSI-Escape-Sequenzen, tputschlägt jedoch fehl (zumindest auf meiner Box).
Wildcard

Antworten:

6

tputkann Ausdrücke (zum Beispiel in sgrund setaf) verarbeiten, die der typische Shell-Scripter weniger als verwendbar finden würde. Um eine Vorstellung davon zu bekommen, worum es geht, sehen Sie sich die Ausgabe infocmpmit der -fangewendeten Option (Formatierung) an. Hier ist eines der Beispiele für die Verwendung dieser Zeichenfolgen aus den Terminfo-Beschreibungen von 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,

Die Formatierung teilt die Dinge auf - ein Skript oder Programm, um dasselbe zu tun, müsste diesen Drehungen und Wendungen folgen. Die meisten Leute geben auf und benutzen nur die einfachsten Saiten.

Die 16-Farben-Funktion wurde von IBM aixterm ausgeliehen, das jeweils 16 Codes für Vordergrund 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 %12s\n' Foreground Background
for n in $(seq 0 15)
do
    F=$(tput setaf $n | cat -v)
    B=$(tput setab $n | cat -v)
    printf '%2d  %12s %12s\n' $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 Zahlen werden aufgeteilt, da aixterm die Bereiche 30-37 und 40-47 verwendet, um mit den ECMA-48-Farben (auch als "ANSI" bezeichnet) übereinzustimmen, und den Bereich 90-107 für Codes verwendet, die nicht in der Norm definiert sind.

Hier ist ein Screenshot mit xterm using TERM=xterm-16color, in dem Sie den Effekt sehen können.

Geben Sie hier die Bildbeschreibung ein

Weiterführende Literatur:

Thomas Dickey
quelle
Ich mag Ihren Standpunkt beweisen, aber wie geht es mit diesen Ausdrücken? Wenn ich mir das Handbuch für infocmp ansehe, stelle ich fest, dass es sich um Wenn-Dann-Sonst-Aussagen handelt ... aber ich habe das noch nie gesehen und habe Probleme, danach zu googeln. Das ist alles, was ich gefunden habe, aber ich bin mir nicht sicher, ob es das ist was passiert hier. Vielen Dank!
Captain Man
2

Aus einer Zeit, in der auf UNIX-Plattformen eine Vielzahl von Geräten angeschlossen sein könnten, bevorzuge ich tput und seine Freunde gegenüber wörtlichen Escape-Sequenzen.

Ich glaube , der wahre Grund ist , dass die meisten Menschen einfach nicht über sie wissen tputund die dazugehörigen terminfo/ termcapDateien und Bibliotheken.

Roaima
quelle
2

Einer der Gründe ist, dass tputder externe Befehl langsamer ausgeführt werden kann als die integrierten Shell-Escape-Codes. Eine andere Sache ist, dass man leicht einen Liner erstellen kann, der ANSI-Escape-Codes mit Shell-spezifischen Escape-Zeichen kombiniert, wie zum Beispiel in der bashEingabeaufforderung:

PS1='\[\033[1;32m\]\u@\h\[\033[1;34m\] \w >\[\033[0m\] '

ähnlich in zsh:

PS1=$'%{\e[1;32m%}%n@%m%{\e[1;34m%} %3~> %{\e[0m%}'

Hier ist alles klar und kompakt. Mit tputeinem müsste man es in mehrere Zeilen aufteilen oder es viel länger und komplexer machen, tputmehrmals ausführen usw.

jimmij
quelle
1
Mit tput können Sie immer noch Oneliners machen, PS1="$(tput setaf 2)\u@\h$(tput reset) >
Captain Man
2
Eigentlich wäre das $(tput sgr0)für das Ende, aber zuzustimmen, dass tput eine Verbesserung ist.
Thomas Dickey