readline 的输入会覆盖提示

readline 的输入会覆盖提示

我正在尝试创建一个交互式 bash 脚本,在其中我可以从 1-n 调用给定选项,或者像命令一样调用它们。

它将最终出现一个模拟提示,并使用“read”来获取输入,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

它将允许我输入更长的文本...不知道为什么..

答案1

从终端读取时,bashreadline在执行read内置函数时使用该库。输入命令行时也使用readline。为了正确处理换行,readline 需要知道提示字符串中的任何字符是否不占用屏幕上的任何空间。

Ctrl+A如果要从 C 调用 readline,则需要用( \001) 和Ctrl+B( \002)包围用于更改屏幕颜色的任何转义序列。

Bash 允许您在分配给命令提示符变量( 、 等)时使用 和 来代替那些控制字符\[。最新版本的 gdb 也支持这一点。\]PS1PS2

显然 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 进行测试。

相关内容