バグのある読み取り関数のエコーを抑制する方法

バグのある読み取り関数のエコーを抑制する方法

シェル スクリプト ( などを使用) でキーの押下をキャプチャしread、それをエコーし​​ないようにしようとしています。私が見つけた 3 つの方法はstty -echo、 、-sスイッチ、およびストリーム リダイレクトです。

ただし、FreeBSD 実装を使用していると思われる macOS では、これらのいずれも一貫して動作しません。

次のスクリプトは問題を示しています。

while true; do
    stty -echo
    read -s -n 1 CHAR &>/dev/null
    stty echo
done

上矢印と下矢印を同時に押すと、コマンドが またはA^[[BとエコーされることがB^[[Aあります。これは、マシンが遅い場合 (バッテリー残量が少ないため) に特に頻繁に発生し、何らかの競合状態を示しています。

何か見落としているのでしょうか? そうでなければ、この問題を回避するにはどうすればいいでしょうか?

答え1

ループでは、ループ終了時の「stty echo」と次の繰り返し時の「stty -echo」の間に短い時間枠があります。この時間枠中に受信したキーボード入力は、読み取りコマンドが待機していなくてもエコーされます。エコーが不要な場合は、「stty echo」を呼び出さないでください。

関連情報