シェルスクリプトでキーストロークをキャプチャしようとしています(たとえば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」を呼び出さないでください。