
Aqui estão minhas tentativas:
O último funcionou, mas quebra o copiar e colar (adicionando muitos espaços ao copiar). Existe uma maneira melhor?
Texto copiável:
$ PS1='\['$'\x1b[0m\]$ '
$ echo -e "\x1b[41;37mWarning text\x1b[0m"; echo Normal text
Warning text
Normal text
$ echo -ne "\x1b[41;37mWarning text"$'\n'"\x1b[0m"; echo Normal text
Warning text
Normal text
$ echo -ne "\x1b[41;37mWarning text"$'\n'"\x1b[47;30m"; tr </dev/zero \\0 \ |head -c 80; echo -ne "\x1b[A"; echo Normal text
Warning text
Normal text
$
$ t="Warning text";echo -ne "\x1b[41;37m";echo -n "$t";{ tr </dev/zero \\0 \ |head -c $(bc <<<"$(stty -a <&3|grep -Po '(?<=columns )[0-9]+')-$(wc -c<<<"$t")+1"); } 3<&0;echo -e "\x1b[0m";echo "Normal text"
Warning text
Normal text
$
Responder1
Encontrei a solução sozinho (emesta questão relacionada). Usa isto:
echo -e '\x1b[41;37mWarning text\x1b[K\x1b[0m';echo Normal text
A documentação diz sobre \x1b[K
:
K EL Erase line (default: from cursor to end of line).
ESC [ 1 K: erase from start of line to cursor.
ESC [ 2 K: erase whole line.
Responder2
Limpar até o final da linha usará a cor de fundo atual com xterm e console Linux, bem como terminais que copiam esse comportamento. Em ncurses, isso é conhecido como recurso de apagamento de cor de fundo (bce). Quando o recurso é suportado, isso fornece uma maneira de manter o plano de fundo da linha atualmente editada com uma determinada cor.
No entanto:
- É menos útil ao editar uma linha quebrada.
- Existem algumas diferenças com os terminais rxvt/urxvt: o recurso de apagamento de caracteres (ech) relacionado não usa a cor de fundo. Seu shell pode usar isso ao editar uma linha.
- Nem todos os terminais usam a cor de fundo atual ao rolar (como fazem o xterm e o console Linux).
Leitura adicional:
Responder3
Que tal agora:
printf '\e[41m%-*s\e[0m\n' $COLUMNS 'Warning text'
Você também pode torná-la uma função para receber argumentos, adicionar variáveis de cores, etc:
linecolor () { printf '\e[41m%-*s\e[0m\n' $COLUMNS "$1"; }
uso:
linecolor 'Warning text'
Responder4
Se uma linha inicial extra em branco for aceitável:
echo -e "\x1b[41;37m\n\x1b[0m\x1b[41;37mWarning\x1b[0m"; echo "Normal"
parece funcionar.
A única explicação que posso encontrar para o comportamento que vejo é que tudo se resume a como o terminal determina qual cor de fundo usar para uma nova linha, o que provavelmente funcionaria de maneira diferente se você usar outro terminal que não o que xterm
eu uso .
Acho que usar printf
torna o último método um pouco mais legível, então, mesmo que isso ainda interrompa a cópia e colagem, aqui vai:
printf "\x1b[41;37m%-$(stty size | cut -d' ' -f2)s\x1b[0m\n" hello; echo world; echo test