次のスクリプトを考えてみましょう。
#!/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"