Por que o \ b não faz o backspace no final?

0

No CentOS, eu uso:

[root@localhost sbin]# echo -e "ab\bc"
ac

o \b significa backspace.

Mas quando eu uso:

[root@localhost sbin]# echo -e "abc\b"
abc

Imprime abc , por que não faz o backspace?

    
por three-blocks 19.06.2017 / 05:23

2 respostas

4

O Backspace não é destrutivo por si só, embora a maioria dos editores (e até mesmo a linha de comando) faça com que pareça assim. O que realmente acontece é que esses programas, enquanto interativos, fazem o backup do cursor, então eles escrevem um espaço e fazem backup novamente para posicionar o cursor corretamente.

Assim, a sua linha pode ser echo -e "abc\b \b" e funcionaria então.

Você pode testar isso fazendo echo -n -e "abc\b" (o -n remove o salto automático para a próxima linha). Seu prompt agora irá sobrescrever o 'c'.

Isso é um pouco semelhante a \n , o que significa ir para a próxima linha (mas não para a margem) e \r , que está indo para a margem (mas não para a próxima linha). Os sistemas operacionais interpretam esses caracteres de maneira diferente (o Unix adiciona uma próxima linha a \ n, o DOS tem os dois caracteres, etc).

    
por 19.06.2017 / 06:24
1

Sim, isso funciona como esperado (o caractere x é removido):

$ echo -e 'ax\bc'
ac

E sim, "parece" que o caractere de retrocesso se perde com isso:

$ echo -e 'abx\b'
abx

Observe que o caractere de retrocesso ( \b ) não é igual à tecla do teclado Backspace .
O teclado Backspace imprime ^? com Ctrl-V Backspace .
Isso é interpretado por muitos editores como voltar e remover um caractere. Isso é muito mais complexo do que apenas imprimir um espaço em branco, a linha inteira à direita precisa ser movida para um espaço (ou dois para caracteres largos ou zero para caracteres de controle) deixados para cada caractere apagado ou, se o caractere apagado é uma nova linha, mova toda a linha de uma linha para cima. Não, isso não é um simples caractere, é um procedimento inteiro conectado à tecla do teclado Backspace .

No entanto, não, o caractere de retrocesso é gravado no console.
Você pode ver o que está sendo transmitido para o console com od :

$ echo -e 'abx\b' | od -vAn -tx1c
  61  62  63  08  0a
   a   b   x  \b  \n

Então, o que acontece?

  1. A string abx é gravada no console.
  2. O console imprime abx no buffer de linha.
  3. O caractere \b é gravado no console.
  4. O caractere \b faz com que o buffer de linha do console mova um caractere para trás.
  5. o caractere \n é impresso no console.
  6. O buffer da linha do console se move para a próxima linha (nada é impresso).
  7. Um "final da string" é impresso no console.
  8. O console exibe todo o buffer de linha.

Essa é a maneira padrão na qual os consoles funcionam.

Dê uma olhada nisso:

$ printf 'abcdef\b\b\b \n'
abc ef

O caractere d é o substituído por um espaço em branco.

Por que o 'ax\bc' remove o x?

Porque o caractere c substitui o caractere x .

    
por 19.06.2017 / 19:44

Tags