Bash

“讀取”上的 Shell 腳本通過輸入鍵和製表鍵接受

  • July 21, 2019

當您有以下內容時,在 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 字元,該設置可能值得特別提及。

引用自:https://unix.stackexchange.com/questions/531081