將終端應答字串讀入變數

將終端應答字串讀入變數

使用巴什,如何將終端應答讀入變數而不需要使用者互動?下面的一行仍然需要Enter按一次:

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 (control-E) 字元通過時 rxvt-unicode 發送到 shell 的回應。它可能包含轉義值,如條目中所述keysym下列的。

(承諾的描述不存在)。

由於應答字串的長度未知,因此讀取該字串的應用程式必須允許等待(以防字元在多個讀取操作中到達)。當然,還有特定於 ksh/bash 的TMOUT功能以及命令-t選項,可以幫助編寫 shell 腳本read。對於一般用途,我避免使用stty,例如(參見dynamic.sh):

stty raw -echo min 0 time 5

暫時設定終端,使 aread在 0.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,要么可能一個接一個乏味地蠶食字節,直到超時觸發:

$ 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.

相關內容