使用バッシュ、ユーザーの操作なしでターミナルの応答を変数に読み込むにはどうすればよいですか? 次のワンライナーは、まだ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固有の機能があります。一般的な使用では、私はそれを避けて、例えば(を参照)を使用します。-t
read
stty
dynamic.sh
):
stty raw -echo min 0 time 5
端末を一時的に設定して、read
0.5 秒でタイムアウトし、文字を読み取らずに返せるようにします。設定がどのように保存/復元されるかを確認するには、スクリプトを読むと役立ちます。
参考文献:
- の
vttests
のスクリプトのxterm
多くは、端末の応答文字列を読み取ります。 stty
- 端末のオプションを設定する(POSIX)read
- 標準入力から1行を読み込む(POSIX)
答え2
タイムアウトと(ある程度の)文字数の読み取りがあっても、bash
(version 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.