Bash
“讀取”上的 Shell 腳本通過輸入鍵和製表鍵接受
當您有以下內容時,在 shell 腳本中:
read my_variable
Enter
是保存輸入的關鍵。有沒有辦法在不刪除功能的情況下
Tab
完成相同的操作?Enter``Enter
這可能有點矯枉過正,但您可以通過使用 來獲得它
read -e
,這會在實用程序上啟用 Readlineread
工具。那時,您想要的結果將只有一個鍵綁定。請注意,Readline 還帶來了許多其他功能,例如完成、歷史記錄等,而對於簡單的
read my_variable
. 如果這些不受歡迎,您必須明確清除鍵綁定並禁用您不想要的read -e
.來自命令行的範例概念驗證:
(bind 'TAB: accept-line'; IFS= read -re var && echo "$var" || echo ko)
您也可以在腳本中執行此操作,但
bind
會發出警告(您仍然可以通過重定向靜音2>/dev/null
)。腳本中命令的替代方法
bind
是在呼叫您希望受到影響的腳本之前提供自定義 inputrc 文件。沒有必要有一個真實的文件,一個 Here Document 就足夠了。上面通過腳本製作的例子:
#!/bin/bash export INPUTRC=/dev/fd/3 script2.sh 3<<EOF TAB: accept-line set history-size 0 EOF # this example 'inputrc'-like file also disables history support
上述腳本將自定義 inputrc 文件準備為文件描述符 3 上的 Here Document,執行的 shell將按照環境變數
script2.sh
的指示讀取該文件。INPUTRC
然後
script2.sh
:#!/bin/bash echo start bind -q accept-line 2>/dev/null # shows which keys are configured to accept input IFS= read -re var && echo "$var" || echo ko echo end
在等待輸入之前
read
,腳本將列印如下內容:accept-line can be invoked via "\C-i", "\C-j", "\C-m".
表明
Tab
(即Ctrl-I
如上所示\C-i
)與Return
(即Ctrl-M
輸入)或換行符(Ctrl-J
)一樣接受一行。對於更“真實世界”的範例:
#!/bin/bash bind 'TAB: accept-line' &>/dev/null echo "enter your name:" IFS= read -re var echo "your name is: $var"
如果您走這條路,請查看Readline 使用者指南,至少在您的
man bash
.set convert-meta off
為了更好地支持非 ascii 字元,該設置可能值得特別提及。