Por que 'ler -s' se comportará de maneira diferente de 'read' se for eliminado com 'ctrl-c'?

0

Considere este script:

#!/bin/bash

echo "hi there $(whoami)"

[ "'whoami'" = "root" ] || {
  exec sudo -u root "$0" "$@"
  echo "this is never called"
}

read -s -p "enter stuff: " stuff
echo "answer: $stuff"

Se eu executar como usuário lars e inserir woohoo , obtenho a seguinte saída:

hi there lars
hi there root
enter stuff:
answer: woohoo

No entanto, se eu ctrl-c enquanto o script está aguardando minha read input, entro em um estado estranho. O console parece estar preso no modo silencioso. O problema não ocorre se eu omitir a opção -s (= modo silencioso).

Você tem alguma idéia de qual é o problema exato aqui? Como posso fazer o script se comportar corretamente se alguém pressionar ctrl-c durante a entrada.

Estou executando o bash 4.3.30.

    
por Lars Schneider 17.08.2018 / 22:59

1 resposta

2

Aparentemente, este é um bug no Bash 4.3 que foi corrigido no Bash 4.4 :

oo. Fixed a bug that caused bash to not clean up readline's state, including the terminal settings, if it received a fatal signal while in a readline() call (including 'read -e' and 'read -s').

Eu trabalhei em torno do problema com uma armadilha que restaura as configurações do terminal:

    [ "'whoami'" = "root" ] || {
      exec sudo -u root "$0" "$@"
    }

    function finish {
      stty echo echok
    }
    trap finish EXIT
    read -s -p "enter stuff: " stuff
    echo "answer: $stuff"
    
por 20.08.2018 / 10:47