Bash脚本用户输入提示

时间:2016-01-14 19:19:28

标签: bash scripting echo user-input prompt

我遇到了生成用户输入提示的已知方法的问题:

read -p "Input something: " variabile

如果尝试使用箭头键会导致问题,它会回显每个箭头键击的ANSI代码

read -e -p "Input something: " variable

这解决了箭头键的问题,但是当达到终端的宽度时,文本输入不会在换行符上继续但在同一行上,覆盖(视觉上)现有输入

echo -n "Input something: "; read -e variable

这显然修复了之前描述的两个问题......直到我发现键入内容然后按下退格键覆盖了提示,并且当输入更长时,从输入的第二个换行符再次显示视觉覆盖。

在没有上述问题的情况下,有没有一种产生提示的好方法?

更新

重新检查后,我现在知道导致read -e -p输入覆盖的原因是什么 我正在使用这些变量突出显示读取提示的文本:

highlight=$(echo -e "\e[1;97m")
clear=$(echo -e "\e[0m")
read -e -p "Input$highlight something$clear: " variable

这是我可以在read提示符内进行突出显示工作的唯一方法(将转义序列分配给变量并不起作用,我需要像我一样回应它们)但它们似乎也会导致输入覆盖问题。

2 个答案:

答案 0 :(得分:1)

shell会跟踪认为提示的时间长度,以便知道用户输入的开始和停止位置。不幸的是,当您在提示中打印颜色转义码时,您会抛出Bash的计数,因为它希望转义字符占用终端中的空间。

为了避免这种情况,你只需要在\[ and \]中包装所有颜色序列,它会告诉你的shell所包含的字符是非打印的,不应该被计算在内。

例如,您的highlight变量应为:

highlight=$(echo -e "\[\e[1;97m\]")

就个人而言,我使用color and pcolor项目中的Prompt.gem函数来处理正确的转义,并使命令更容易阅读:

read -e -p "Input $(pcolor DEFAULT BOLD)something$(pcolor): " variable

答案 1 :(得分:1)

正如dimo414提到的那样,readline认为提示比它更长。在计算长度时,它计算终端转义序列中的每个字符。您可以看到它认为转义序列的持续时间如下

echo ${#highlight}

在bash PS1提示符中,用"\[""\]"围绕这样的转义序列指示readline忽略计算当前行长度之间的所有内容,但这些不是bash的正确转义{{ 1}}内置。

read的转义为read$'\001',如BashFAQ中所述,但根据我的经验,您需要$'\002'选项-e 1}},也是。做你想做的蛮力方式是:

read

为了终端独立性,您应该使用tput而不是硬编码的转义序列。阅读read -e -p "Input "$'\001'"${highlight}"$'\002'something$'\001'"${clear}"$'\002'": "

请参阅my dotfiles了解优雅的bash函数,为您执行上面的开始/结束引用。