シェル スクリプト ( などを使用) でキーの押下をキャプチャし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」を呼び出さないでください。