Bash
來自 readline 的輸入會覆蓋提示
我正在嘗試創建一個互動式 bash 腳本,我可以在其中呼叫 1-n 中的給定選項,或者像命令一樣呼叫它們。
它將以模擬提示結束,並且“讀取”用於獲取輸入,ofc。
但是,如果我輸入的文本太大,它將返回到行首並在我輸入時覆蓋提示。
提示是彩色編碼的,如果我刪除顏色轉義,它會很好。但我喜歡顏色:)
腳本提示是這樣的:
NOC=$(echo -en '\033[0m') # Default RED=$(echo -en '\033[00;31m') YELLOW=$(echo -en '\033[00;33m') CYAN=$(echo -en '\033[00;36m') OPROMPT="${RED}[Admin${CYAN}@${RED}bulletproof]#${NOC}" until [ ! -z "$MCHOICE" ]; do read -p "${OPROMPT} " -e MCHOICE done
我應該怎麼做才能阻止這種行為?似乎想不通。如果我使用 echo 或 printf 來顯示提示,如果我輸入一些內容然後按退格鍵更正它,它將刪除它。
如果我不清楚,這裡有一個例子:這是提示(只是圖片顏色:P)
"[Admin@bulletproof]# "
…現在輸入命令:
"[Admin@bulletproof]# vpn start my"
…現在我繼續打字
"domain.lanletproof]# vpn start my"
什麼時候應該:
"[Admin@bulletproof]# vpn start mydomain.lan"
我還注意到緩衝區因終端視窗大小而異。當我最大化終端時,它不會在同一點開始切斷,但具有更長的“容忍度”
編輯:剛剛想出了一種方法來大幅改善關於這個的“緩衝”。
如果我這樣設置程式碼:
until [ ! -z "$MCHOICE" ]; do printf "$OPROMPT" read -p " " -e MCHOICE done
它將允許我輸入更長的文本…不知道為什麼..
從終端讀取時,bash
readline
在執行read
內置函式時使用該庫。它在輸入命令行時也使用 readline。為了正確處理換行,readline 需要知道提示字元串中的任何字元是否不佔用螢幕上的任何空間。如果您要從 C 中呼叫 readline,您將使用
Ctrl+A
(\001
) 和Ctrl+B
(\002
) 包圍任何用於更改螢幕顏色的轉義序列。Bash 允許您在分配給命令提示符變數( 、 等)時使用and代替
\[
那些\]
控製字元。更新版本的 gdb 也支持這一點。PS1``PS2
顯然 bash 不允許為
read -p
. 所以你需要使用這些控製字元。NOC=$'\001\e[0m\002' # Default RED=$'\001\e[00;31m\002' YELLOW=$'\001\e[00;33m\002' CYAN=$'\001\e[00;36m\002' OPROMPT="${RED}[Admin${CYAN}@${RED}bulletproof]#${NOC}" until [ ! -z "$MCHOICE" ]; do read -p "${OPROMPT} " -e MCHOICE done
用 bash 4.4.23 測試。