Este script gera 5 linhas com a terceira sendo sublinhada:
#!/usr/bin/env bash
set -eu
bold=$(tput bold)
reset=$(tput sgr0)
underline=$(tput smul)
echo 'line 1
line 2
line 3
line 4
line 5' | awk -v bold="$bold" -v reset="$reset" -v underline="$underline" '
NR == 3 {print underline $0 reset}
NR != 3 {print $0}
'
Se eu não redefinir (no script) no final da terceira linha, todas as linhas a seguir serão sublinhadas, incluindo os comandos que digito a seguir (no shell). Até eu correr reset
. Com less
( ./my-script.sh | less -R
) não apenas reset
(no script) não é necessário (a terceira linha fica sublinhada), mas também produz um símbolo extra em tmux
( ^O
, TERM=screen-256color
):
line 1
line 2
line 3^O
line 4
line 5
Mas nenhum símbolo no console simples ( TERM=xterm-256color
).
O que exatamente e por que isso acontece? Existe uma maneira de fazer o script funcionar em todos esses casos?
$ ./my-script.sh
$ ./my-script.sh | grep line --color=never
$ ./my-script.sh | less -R
Por exemplo, para fazer o seguinte script funcionar melhor.
less
envia seu próprio "reset" no final da linha, que passa a ser derivado do terminfosgr0
por (ncurses) eliminando o^O
(redefinir conjunto de caracteres alternativo) porqueless
está usando a interface termcap. A capacidade termcap me que corresponde a terminfo sgr0 convencionalmente não modifica o estado alternativo do conjunto de caracteres, conforme observado na página de manual curs_termcap(3x) :Talvez
less
esteja fazendo essa redefinição para se recuperar de sequências de escape inesperadas: a-R
opção foi projetada apenas para lidar com cores ANSI (e escapes formatados de forma semelhante, como negrito, sublinhado, piscar, destaque). O código-fonte não menciona isso, mas aA_NORMAL
atribuição informaless
para posteriormente emitir o reset:Como alternativa para
sgr0
(que redefine todos os atributos de vídeo e é apenas parcialmente compreendido por menos), você pode fazere (para muitos terminais/muitos sistemas, incluindo
TERM=screen-256color
) redefinir apenas o sublinhado. No entanto, isso não afeta o negrito , nem há um recurso terminfo/termcap convencional para redefinir o negrito. Mas a tela implementa a sequência ECMA-48 correspondente que faz isso (SGR 22 versus o 24 usado emrmul
), então você pode codificar esse caso.