Existe algum benefício objetivo para escapar de seqüências ao longo da luta?

11

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

Eu tinha o entendimento de 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 ...?)

Capitão Homem
fonte
Por outro lado, a questão da portabilidade, o MobaXterm funcionará com as printfseqüências de escape ANSI, mas tputfalha (pelo menos na minha caixa).
Curinga

Respostas:

6

tputpode lidar com expressões (por exemplo, em sgre setaf) que o shell-scripter típico consideraria menos que utilizável. Para ter uma idéia do que está envolvido, consulte a saída infocmpcom a -fopção (formatação) aplicada. Aqui está um exemplo de como usar essas strings das descrições 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 as coisas - um script ou programa para fazer o mesmo teria que seguir essas reviravoltas. A maioria das pessoas desiste e apenas usa as cordas mais fáceis.

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

  • 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 ECMA-48 (também conhecidas como "ANSI") e usa o intervalo 90-107 para códigos não definidos no padrão.

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

insira a descrição da imagem aqui

Leitura adicional:

Thomas Dickey
fonte
Posso estar provando seu ponto de vista, mas qual é o problema com essas expressões? De olhar para o manual para infocmp eu percebo que eles são declarações if-then-else ... mas eu nunca vi isso e eu estou tendo problemas pesquisando para ele, isso é tudo que eu encontrei, mas eu não tenho certeza que é o que esta acontecendo aqui. Obrigado!
Capitão Man
2

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

Eu acho que a verdadeira razão é que a maioria das pessoas simplesmente não conhece tpute seus terminfo/ termcaparquivos e bibliotecas associados .

roaima
fonte
1

Um dos motivos é que tputé o comando externo, portanto, pode ser executado mais lentamente que os códigos de escape do shell interno. Outra coisa é que é possível criar facilmente um liners combinando códigos de escape ANSI com caracteres de escape específicos do shell, como no bashprompt, por exemplo:

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

Da mesma forma em zsh:

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

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

jimmij
fonte
1
Com tput você ainda pode fazer Oneliners, PS1="$(tput setaf 2)\u@\h$(tput reset) >
Capitão Man
2
Na verdade, isso seria $(tput sgr0)para o final, mas concordar que a tput é uma melhoria.
Thomas Dickey