Bash

來自 readline 的輸入會覆蓋提示

  • April 30, 2019

我正在嘗試創建一個互動式 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

它將允許我輸入更長的文本…不知道為什麼..

從終端讀取時,bashreadline在執行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 測試。

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