Existe algum benefício objetivo para escapar seqüências sobre tput?

7

Nos arquivos ' .*rc ' das pessoas que vejo on-line ou em vários códigos, tenho a tendência de ver muitas pessoas que usam manualmente seqüências de escape ANSI em vez de usar tput .

Eu entendi que tput é mais universal / seguro, então isso me faz pensar:

Existe alguma razão objetiva para usar seqüências de escape no lugar de tput ? (Portabilidade, robustez em erros, terminais incomuns ...?)

    
por Captain Man 05.04.2016 / 16:40

3 respostas

5

tput pode manipular expressões (por exemplo, em sgr e setaf ) que o típico shell-scripter encontrará menos que utilizáveis. Para ter uma ideia do que está envolvido, veja a saída de infocmp com a opção -f (formatação) aplicada. Aqui está um dos exemplos usando essas strings das descrições do terminfo :

do 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,

A formatação divide tudo - um script ou programa para fazer o mesmo teria que seguir essas voltas e reviravoltas. A maioria das pessoas desistem e apenas usam as strings mais fáceis.

O recurso de 16 cores é emprestado do IBM aixterm, que mapeia 16 códigos para primeiro plano e segundo plano em dois intervalos;

  • em primeiro plano para 30-37 e 90-97
  • fundo para 40-47 e 100-107

Um script simples

#!/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 a saída mostram como 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

Os números são divididos porque o aixterm usa os intervalos 30-37 e 40-47 para corresponder às cores do ECMA-48 (também conhecido como "ANSI") e usa o intervalo 90-107 para códigos não definido na norma.

Aqui está uma captura de tela com o xterm usando TERM=xterm-16color , onde você pode ver o efeito.

Leituraadicional:

por 05.04.2016 / 23:00
2

Vindo de uma época em que plataformas UNIX poderiam ter uma variedade de dispositivos conectados a elas, eu ainda prefiro tput e seus amigos sobre sequências de escape literais.

Acho que o motivo real é que a maioria das pessoas simplesmente não sabe sobre tput e seus arquivos e bibliotecas terminfo / termcap associados.

    
por 05.04.2016 / 22:14
2

Uma das razões é que tput é o comando externo, portanto, pode ser mais lento que os códigos de escape de shell internos. Outra coisa é que é possível criar facilmente um forro combinando códigos de escape ANSI com caracteres de escape específicos do shell, como no prompt bash , por exemplo:

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

similarmente em zsh :

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

Aqui tudo é claro e compacto. Com tput , seria necessário dividi-lo em várias linhas ou torná-lo muito mais longo e complexo, executando tput várias vezes, etc.

    
por 05.04.2016 / 20:55