使用巴什,如何將終端應答讀入變數而不需要使用者互動?下面的一行仍然需要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 秒內逾時,並允許其返回而不讀取任何字元。要了解如何保存/恢復設置,閱讀腳本會有所幫助。
延伸閱讀:
- 這
vttests
中的腳本xterm
,其中許多讀取終端響應字串。 stty
- 設定終端的選項(POSIX)read
- 從標準輸入讀取一行(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
,要么可能一個接一個乏味地蠶食字節,直到超時觸發:
$ 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.