
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 inesperadamente um despejo de gosma não analisada, o que presumo significa que meu terminal (no Mac OS) não suporta o código de escape usado, apesar de ter lido em vários lugares que eles significam a mesma coisa:
27 = 033 = 0x1b = ^[ = \e
Procurando, encontreiesta pergunta sobre a detecção de suporte com escape de barra.
A resposta selecionada fareja o $TERM
valor 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 o quão confiável isso é.
Existe uma maneira padrão de verificar o suporte ao código de escape (principalmente para Bash) ou esse script é praticamente o comum?
- Alternativamente, que código de escape posso usar para 'garantir' o suporte mais difundido?
- E quanto à expansão de eco -e?
- Quais são as melhores práticas gerais em termos de portabilidade/disponibilidade/distribuição pararoteirosque usam ou fazem referência a códigos de controle?
Isso éuma boa leitura tambémpara qualquer pessoa que esteja procurando informações.
Responder1
Você tem operações específicas em mente?
Aqui está um exemplo de usomodo de destaque, que em muitos terminais dará um resultado forte e visível:
tput smso; echo hello, world; tput rmso
A tput
ferramenta usa o valor da $TERM
variável de ambiente para determinar quais sequências de escape serão geradas - se houver. Por exemplo
TERM=xterm
( tput smso; echo hello, world; tput rmso ) | hexdump -C
00000000 1b 5b 37 6d 68 65 6c 6c 6f 2c 20 77 6f 72 6c 64 |.[7mhello, world|
00000010 0a 1b 5b 32 37 6d |..[27m|
TERM=dumb
( tput smso; echo hello, world; tput rmso ) | hexdump -C
00000000 68 65 6c 6c 6f 2c 20 77 6f 72 6c 64 0a |hello, world.|
Pares de características interessantes podem ser encontrados emman 5 terminfo
, alguns dos quais são os seguintes:
- Destaque:
smso
ermso
- Sublinhar:
smul
ermul
- Pisque (sim!):
blink
- Dupla largura:
swidm
erwidm
- Reverter:
rev
- Cancelar tudo:
sgr0
Se você quiser escrever um texto em negrito, mas somente se o terminal entender, então um trecho como este funcionará
boldOn=$(tput smso)
boldOff=$(tput rmso)
# ...
printf "%s%s%s\n" "$boldOn" 'This message will be in bold, when available' "$boldOff"
Responder2
Na verdade é possível consultar terminais DEC (e seus clones e emulações, incluindo xterm) sobre suas capacidades; apenas não sobre o suporte individual à sequência de escape (ou sua integridade). O UNIX geralmente não usa esse recurso, contando com bancos de dados termcap/terminfo (que também documentam as peculiaridades).
Para referência, as sequências são DA ("Device Attributes", padrão ANSI) e DECID ("Identify Terminal", DEC private).