我正在尝试创建一个交互式 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 也支持这一点。\]
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 进行测试。