このような愚かな質問で面倒になって申し訳ありませんが、最近Linuxターミナルを使い始め、このコマンドに関する論文を読んだときに、stty
次の問題が見つかりました。
¿エコーを変更して待たずに読むことができる方法は何ですかENTER(「0」から「f」までの16進数を入力するだけです)?
私は最初の部分stty -echo
とstty echo
。
しかし、待たずに端末で読む方法がわかりませんENTER。 2番目の項目を検索しましたが、コマンドでこれを達成するための設定がman
見つかりませんでした。stty
簡単にする必要があることを知っていますが、入力16進数を追加するソリューションやロジックを見つけることができません。
答え1
read - shell組み込みコマンドを参照している場合は、ENTERを待つのではなく、N文字を読み取って返すオプションがあります。努力する:
read -n1 ; echo You entered $REPLY
返品、read --help
答え2
押す必要があるEnterのは、ターミナルデバイスドライバ(/dev/tty*
または/dev/pt*
対話するキーボードとモニタを持つ物理デバイスではなくデバイスの背後にあるカーネルコード)がデフォルトの行エディタを実装するためです。
たとえば、アプリケーションがread()
開いているファイル記述子に対してシステムコールを実行するときにEnterキーを押すと(CRを使用すると、キーを押したときに端末から送信された文字がLFに変換されます)。/dev/pts/0
read()
BackspaceCtrl+UCtrl+WEnter
ラインエディタを無効にするには、デバイスドライバで特定の制御コマンドを実行する必要があります。ここでstty
コマンドが実行されます。
を使用すると、stty -icanon
行エディタが無効になります(stty cbreak
一部のシステムではこれを必要とし、stty cbreak
代替としてサポートされることがよくあります)。
このモードでない場合は、icanon
いくつかの追加パラメータを使用してカスタマイズします。直接モデル:
^C
、^Z
まだ割り込み/中断が発生します。stty -isig
読み取りアプリケーションにそのまま渡されるように無効にする必要があります。^Q
、^S
まだフロー制御に使用されます(stty -ixon
無効)。CR
それでもに変換されるので、無効にする必要がLF
あります。stty -icrnl
stty raw
これはすべての機能と一部の機能を無効にするショートカットです。出力ハンドリングも同じだ。さらに、1つを追加すると、-echo
デバイス/dev/pts/1
は端末と対話するアプリケーション間の通常のパスのように動作します。
だから:
saved_settings=$(stty -g)
stty raw -echo
byte=$(dd bs=1 count=1 2> /dev/null)
stty "$saved_settings"
一つは準備されるでしょう。バイト(特定のキーが押されたときに端末が送信できる文字シーケンスは言うまでもなく文字ではありません)端末から送信されると、端末デバイスから送信されます。
kshを除いて(vi
kshが独自の行エディタを実装する//オプションを持っている場合は、bashでそれに対応するものを参照)、組み込みemacs
機能はデフォルトで端末デバイスの設定を変更しないため、入力を待つ必要があります。すべてのコンテンツの端末装置から。gmacs
vared
zsh
read -e
read
Enter
ただし、read
zshの組み込み機能(-k
または-q
オプションを含む)とksh93、bash、またはmkshの組み込み機能(-n
または-N
オプションを含む)はこのicanon
モードを無効にして、入力を受信したときに1回のキーを押すことができます。端末デバイス(isig
無効になっていないため、スクリプトを中断することができます(Ctrl+C例:)。