「ctrl-c」で終了すると、「read -s」が「read」と異なる動作をするのはなぜですか?

「ctrl-c」で終了すると、「read -s」が「read」と異なる動作をするのはなぜですか?

次のスクリプトを考えてみましょう。

#!/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"

userとして実行してlarsを入力すると、woohoo次の結果が表示されます。

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

しかし、スクリプトが待っている間に入力をctrl-c待つと、read奇妙な状態になります。コンソールがサイレントモードで停止しているようです。 (=自動モード)オプションを省略すると-s問題は発生しません。

ここで正確な問題は何ですか?ctrl-c入力中に誰かが押すとスクリプトが正しく実行されるようにするにはどうすればよいですか?

私はbash 4.3.30を実行しています。

ベストアンサー1

明らかにこれBash 4.3のバグがBash 4.4で修正されました。:

ああ。 readline() 呼び出し ("read -e" および "read -s" を含む) 中に致命的な信号が受信された場合 bash が readline の状態 (ターミナル設定を含む) をクリーンアップできないバグを修正しました。

回復端末で設定したトラップを使用してこの問題を解決しました。

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

    function finish {
      stty echo echok
    }
    trap finish EXIT
    read -s -p "enter stuff: " stuff
    echo "answer: $stuff"

おすすめ記事