待たずに端末で読む[ENTER]

待たずに端末で読む[ENTER]

このような愚かな質問で面倒になって申し訳ありませんが、最近Linuxターミナルを使い始め、このコマンドに関する論文を読んだときに、stty次の問題が見つかりました。

¿エコーを変更して待たずに読むことができる方法は何ですかENTER(「0」から「f」までの16進数を入力するだけです)?

私は最初の部分stty -echostty 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/0read()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を除いて(vikshが独自の行エディタを実装する//オプションを持っている場合は、bashでそれに対応するものを参照)、組み込みemacs機能はデフォルトで端末デバイスの設定を変更しないため、入力を待つ必要があります。すべてのコンテンツの端末装置から。gmacsvaredzshread -ereadEnter

ただし、readzshの組み込み機能(-kまたは-qオプションを含む)とksh93、bash、またはmkshの組み込み機能(-nまたは-Nオプションを含む)はこのicanonモードを無効にして、入力を受信したときに1回のキーを押すことができます。端末デバイス(isig無効になっていないため、スクリプトを中断することができます(Ctrl+C例:)。

関連情報