我正在尝试创建一个交互式 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
. 所以你需要使用这些控制字符。用 bash 4.4.23 测试。