端末の応答文字列を変数に読み込む

端末の応答文字列を変数に読み込む

使用バッシュ、ユーザーの操作なしでターミナルの応答を変数に読み込むにはどうすればよいですか? 次のワンライナーは、まだEnter1 回押す必要があります。

echo -ne '\005' && read -s && echo ${REPLY}

また、どのように設定すればよいですかXterm何か意味のある応答を送信しますか^E?これまでのところ、応答を送信している唯一の端末エミュレータはパテ

答え1

応答文字列はxtermで設定可能で、answerbackStringリソース。そのリソースは1998最初は「xterm」を返します。1999一部のユーザーは、制御シーケンスが悪用され、予期しないコマンドがコンピューターに送信される可能性があることに気付いたため、デフォルトで空の文字列になっています。

他の端末は常に空の文字列を返す場合があります (konsole、mlterm、vte)。ただし、rxvt (および rxvt-unicode) は予期しない応答を返します。VT102 のデバイス属性応答 (エスケープ シーケンス) です。 PuTTY は「PuTTY」を返します(おそらく xterm による初期の影響によるもの)。

簡単に確認すると、Linux コンソールに「a」が表示されます (おそらくバグ)。

オリジナルのVT100では、これをセットアップ/構成可能な機能として提供していたため、印刷可能文字です。そのため、rxvt/urxvt の応答は予期しないものになります。マニュアル ページには、これに関する不明瞭なコメントが記載されています。

answerbackString:
ENQ(コントロール-E)文字が通過したときにrxvt-unicodeがシェルに送信する応答を指定します。keysym続く。

(約束された説明がありません)。

応答文字列の長さは不明なので、それを読み取るアプリケーションは待機時間を考慮する必要があります(文字が複数の読み取り操作で到着した場合)。もちろん、コマンドのオプションTMOUTとともに、シェルスクリプトに役立つksh/bash固有の機能があります。一般的な使用では、私はそれを避けて、例えば(を参照)を使用します。-treadsttydynamic.sh):

stty raw -echo min 0 time 5

端末を一時的に設定して、read0.5 秒でタイムアウトし、文字を読み取らずに返せるようにします。設定がどのように保存/復元されるかを確認するには、スクリプトを読むと役立ちます。

参考文献:

答え2

タイムアウトと(ある程度の)文字数の読み取りがあっても、bashversion 4.2.46(1)-release)は を保存できないようですREPLY。ここでは、最初に改行を入力してから、次にタイムアウトを待機する「カーソル位置の報告」制御シーケンスを発行します。

$ echo -ne '\033[6n' && read -n 16 -s -t 3; echo -n $REPLY | xxd
0000000: 1b5b 3234 3b31 52                        .[24;1R
$ echo -ne '\033[6n' && read -n 16 -s -t 3; echo -n $REPLY | xxd
$ 

ここでの問題は、-nが返されるバイト数より大きいことです。-nがちょうど正しいサイズかそれより小さい場合、入力 (またはタイムアウト) を必要とせずに応答が読み取られます。 応答文字列の最後の一意の文字がわかっている場合は、その文字で「行」を分割することで応答を取得できます。 レポート文字位置プロンプトの場合、その区切り文字は次のようになりますR

$ echo -ne '\033[6n' && read -n 999 -d R -s; echo -n $REPLY | xxd
0000000: 1b5b 3234 3b31                           .[24;1
$ 

bash長さが不明な不明な入力が与えられた場合、 に対してバグを報告するか、タイムアウトがトリガーされるまで 1 バイトずつ面倒な処理を実行する必要があります。

$ out="got "; echo -ne '\033[6n'; while read -n 1 -s -t 1; do out="$out$REPLY"; done
$ echo -n $out | xxd
0000000: 676f 7420 1b5b 3234 3b31 52              got .[24;1R
$ 

control+eが思うに端末が何かを送り返す可能性があるただし、そのように設定する必要があります。

ENQ       Return Terminal Status (Ctrl-E).  Default response is an empty
          string, but may be overridden by a resource answerbackString.

関連情報