C'è qualche vantaggio oggettivo per sfuggire alle sequenze rispetto al tput?


11

Nei .*rcfile delle persone che vedo online o in vari codici, tendo a vedere molte persone che usano manualmente le sequenze di escape ANSI invece di usarle tput.

Ho capito che tputè più universale / sicuro, quindi questo mi fa meravigliare:

C'è qualche ragione oggettiva per cui si dovrebbero usare le sequenze di escape al posto di tput? (Portabilità, robustezza in caso di errori, terminali insoliti ...?)


Il rovescio della medaglia della portabilità, MobaXterm funzionerà con le printfsequenze di escape ANSI, ma tputfallisce (almeno sulla mia scatola).
Wildcard

Risposte:


6

tputè in grado di gestire espressioni (ad esempio in sgre setaf) che il tipico programmatore di shell troverebbe meno utilizzabile. Per avere un'idea di ciò che è coinvolto, vedere l'output infocmpcon l' -fopzione (formattazione) applicata. Ecco uno degli esempi che usano 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 questi colpi di scena. Molte persone rinunciano e usano solo le stringhe più semplici.

La funzione a 16 colori è presa in prestito da IBM aixterm, che mappa 16 codici ciascuno per primo piano e sfondo su due intervalli;

  • primo piano su 30-37 e 90-97
  • sfondo su 40-47 e 100-107

Una sceneggiatura semplice

#!/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

e output mostrano 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 divisi perché aixterm utilizza gli intervalli 30-37 e 40-47 per abbinare i colori ECMA-48 (noto anche come "ANSI") e utilizza l'intervallo 90-107 per codici non definiti nello standard.

Ecco uno screenshot con xterm che usa TERM=xterm-16color, dove puoi vedere l'effetto.

inserisci qui la descrizione dell'immagine

Ulteriori letture:


Forse sto dimostrando il tuo punto, ma qual è il problema con queste espressioni? Guardando il manuale infocmp mi rendo conto che sono dichiarazioni if-then-else ... ma non ho mai visto questo e sto avendo problemi googling per esso, questo è tutto quello che ho trovato, ma non sono sicuro che sia cosa sta succedendo qui. Grazie!
Captain Man,

2

Venendo da un momento in cui le piattaforme UNIX potevano avere una varietà di dispositivi collegati, preferisco ancora tput e i suoi amici rispetto a sequenze letterali di escape.

Penso che il vero motivo sia che la maggior parte delle persone semplicemente non ne è a conoscenza tpute i relativi file terminfo/ termcaplibrerie.


1

Uno dei motivi è che tputè il comando esterno, quindi potrebbe essere più lento dei codici di escape della shell integrati. Un'altra cosa è che si può facilmente creare un liner che combina codici di escape ANSI con caratteri di escape specifici della shell, come ad esempio nel bashprompt:

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

allo stesso modo in zsh:

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

Qui tutto è chiaro e compatto. Con tputuno sarebbe necessario dividerlo su più linee o renderlo molto più lungo e complesso, eseguendolo tputpiù volte, ecc.


1
Con tput puoi ancora fare oneliners, PS1="$(tput setaf 2)\u@\h$(tput reset) >
Captain Man

2
In realtà sarebbe $(tput sgr0)per il finale, ma concordare sul fatto che tput è un miglioramento.
Thomas Dickey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.