Detecta programaticamente o código de escape ANSI suportado pelo terminal

2

Estou brincando com scripts de shell que usam códigos ANSI e descobri que por um motivo ou outro códigos de escape diferentes são suportados, dependendo do seu terminal / sistema operacional.

Em alguns casos, recebo um despejo inesperadamente inesperado, o que suponho que meu terminal (no Mac OS) não suporta esse código de escape usado, apesar de ter lido em vários lugares que eles significam o mesmo coisa:

27 = 033 = 0x1b = ^[ = \e

Na pesquisa, encontrei esta questão sobre a detecção de suporte com escape de slash .

A resposta selecionada fareja o valor $TERM para detectar

case $TERM in
  (|color(|?))(([Ekx]|dt|(ai|n)x)term|rxvt|screen*)*)
    PS1=$'\e\]0;$GENERATED_WINDOW_TITLE\a'"$PS1"
esac

Mas eu me pergunto quão confiável isso é.

Existe uma maneira padrão de verificar o suporte ao código de escape (principalmente para o Bash), ou esse script é praticamente o funcionamento do moinho?

  • Como alternativa, qual código de escape posso usar para "garantir" mais suporte amplo?
  • E quanto à expansão de eco -e?
  • Quais são as práticas recomendadas gerais em termos de portabilidade / disponibilidade / distribuição para scripts que usam ou fazem referência a códigos de controle?

Eu sou muito verde para aprofundar nix nuances e sessões de terminal, então seja gentil.

Isso é uma boa leitura também para qualquer pessoa que esteja procurando informações.

    
por qodeninja 07.10.2014 / 01:05

2 respostas

3

Você tem operações específicas em mente?

Aqui está um exemplo do uso do modo de destaque , que em muitos terminais dará um strong resultado visível:

tput smso; echo hello, world; tput rmso

Se você fosse canalizar a sequência para, digamos, cat , o realce se tornaria uma operação vazia, porque um cano não é um dispositivo que entende o modo de destaque:

( tput smso; echo hello, world; tput rmso ) | cat

Pares característicos interessantes podem ser encontrados em man 5 terminfo , algumas das quais são as seguintes:

  • Destaque: smso e rmso
  • Sublinhado: smul e rmul
  • Pisca (sim!): blink
  • Doublewide: swidm e rwidm
  • Reverso: rev
  • Cancelar tudo: sgr0
por 21.07.2015 / 00:22
2

Na verdade, é possível perguntar aos terminais DEC (e seus clones e emulações, incluindo o xterm) sobre suas capacidades; não apenas sobre o suporte à sequência de escape individual (ou sua integridade). O UNIX geralmente não usa esse recurso, contando com bancos de dados termcap / terminfo (que documentam as peculiaridades também).

Para referência, as seqüências são DA ("Device Attributes", padrão ANSI) e DECID ("Identify Terminal", DEC private).

    
por 20.07.2015 / 22:27