(Como) posso obter 'read var' para adicionar o literal \ b (backspace) ao var?

0

Por exemplo, o usuário digita foofoo\b\b\bbar , pressiona enter e obtém var equaling foofoo\b\b\bbar em vez de foobar . Sim, o usuário perde o recurso de exclusão, portanto, precisa usar outro atalho para exclusão. Ou pelo menos o inverso: backspace normal (pressionando) dá a eles foobar e algum modificador + backspace-key dá a eles espaços de retorno literais.

Existe uma maneira de permitir que read aceite backspaces literais?

    
por glarry 28.01.2018 / 09:46

3 respostas

1

Esse script (no bash) aceita qualquer caractere, exceto

  1. ^ C (ASCII 03 ETX)
  2. ^ J (ASCII 0A LF)
  3. ^ M (ASCII 0D CR)
  4. ^ Z (ASCII 1A SUB)
  5. ^ \ (ASCII 1C FS)

incluindo todos os outros caracteres de controle:

#!/bin/bash

while IFS= read -srn1 a ;do
    [[ "${a+x$a}" = "x" ]] && break
    var=$var$(printf '%s' "$a")
    printf '%s' "$a"
done
printf '\n%s\n' "$var"

Digite os espaços de retorno como CTRL - H .

Substituir:

printf '\n%s\n' "$var"

com:

printf '%s' "$var" | od -An -tx1

Para realmente "ver" os valores de bytes.

    
por 28.01.2018 / 18:01
2

Você pode usar Ctrl v para inserir um caractere textual:

bash-4.2$ read foo
abc^Hfoo
bash-4.2$ printf "%s\n" "$foo" | od -c
0000000   a   b   c  \b   f   o   o  \n
0000010
bash-4.2$ printf "%q\n" "$foo"
$'abc\bfoo'

O ^H é Ctrl v Retrocesso (ou Ctrl v Ctrl H , que deve ser o mesmo dependendo das configurações do terminal.

    
por 28.01.2018 / 09:59
2

Se você quiser permitir que o usuário insira \b (barra invertida-b) para um backspace, você poderá substituí-lo após o read :

read -r var
var=${var//\b/$'\b'}

Se você quiser que o usuário consiga acertar o backspace sem usar Ctrl-V , você poderá desabilitar temporariamente o caractere de apagar do terminal. Você provavelmente precisará substituir ^? / \x7f por ^H / \x08 posteriormente.

stty_saved=$(stty -g)
stty erase ""
read var
var=${var//$'\x7f'/$'\b'}
stty "$stty_saved"

O backspace ainda é impresso como ^? , como acontece com Ctrl-V .

(Se, em vez disso, você quiser que backspaces removam caracteres na tela, mas ainda assim tenham o backspace e os caracteres removidos salvos, você provavelmente terá que implementá-lo manualmente.)

    
por 28.01.2018 / 10:56

Tags