¿Hay algún beneficio objetivo para escapar de secuencias sobre tput?


11

En .*rclos archivos de las personas que veo en línea o en varios códigos, tiendo a ver a muchas personas que usan manualmente secuencias de escape ANSI en lugar de usar tput.

Comprendí que tputes más universal / seguro, así que esto me hace preguntarme:

¿Hay alguna razón objetiva por la que uno deba usar secuencias de escape en lugar de tput? (Portabilidad, robustez ante errores, terminales inusuales ...?)


En el otro lado de la pregunta de portabilidad, MobaXterm funcionará con printfsecuencias de escape ANSI, pero tputfalla (al menos en mi caja).
Comodín

Respuestas:


6

tputpuede manejar expresiones (por ejemplo en sgry setaf) que el shell-scripter típico encontraría menos que utilizables. Para tener una idea de lo que está involucrado, vea el resultado infocmpcon la -fopción (formateo) aplicada. Aquí hay uno de los ejemplos que usan esas cadenas de las descripciones 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,

El formato divide las cosas: un script o programa para hacer lo mismo tendría que seguir esos giros y vueltas. La mayoría de las personas se rinden y solo usan las cuerdas más fáciles.

La característica de 16 colores está prestada de IBM aixterm, que asigna 16 códigos cada uno para el primer plano y el fondo en dos rangos;

  • primer plano en 30-37 y 90-97
  • fondo en 40-47 y 100-107

Un guion simple

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

y la salida muestran cómo funciona:

      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

Los números se dividen porque aixterm usa los rangos 30-37 y 40-47 para que coincidan con los colores ECMA-48 (también conocido como "ANSI"), y usa el rango 90-107 para códigos no definidos en el estándar.

Aquí hay una captura de pantalla con xterm usando TERM=xterm-16color, donde puedes ver el efecto.

ingrese la descripción de la imagen aquí

Otras lecturas:


Puedo estar demostrando su punto, pero ¿cuál es el trato con estas expresiones? Al mirar el manual para infocmp, me doy cuenta de que son declaraciones si-entonces-otra vez ... pero nunca he visto esto y estoy teniendo problemas para buscarlo en Google, esto es todo lo que encontré, pero no estoy seguro de que sea que está sucediendo aquí. ¡Gracias!
Capitán Man

2

Viniendo de una época en que las plataformas UNIX podían tener una variedad de dispositivos conectados a ellas, todavía prefiero tput y sus amigos a las secuencias de escape literales.

Creo que la verdadera razón es que la mayoría de la gente simplemente no sabe acerca de tputsus terminfo/ termcaparchivos y bibliotecas asociadas .


1

Una de las razones es que tputes el comando externo, por lo que puede ejecutarse más lentamente que los códigos de escape de shell integrados. Otra cosa es que uno puede crear fácilmente un revestimiento que combina códigos de escape ANSI con caracteres escapados específicos del shell, como bashpor ejemplo en el indicador:

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

de manera similar en zsh:

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

Aquí todo es claro y compacto. Con tputuno necesitaría dividirlo en varias líneas o hacer que sea una línea mucho más larga y compleja, ejecutar tputvarias veces, etc.


1
Con tput todavía puedes hacer oneliners, PS1="$(tput setaf 2)\u@\h$(tput reset) >
Captain Man el

2
En realidad, eso sería $(tput sgr0)para el final, pero aceptar que tput es una mejora.
Thomas Dickey
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.