我了解
n = new line or carriage return
b = move cursor to the left once (does not delete anything)
当你在这个命令中把这两个放在一起时:
read -p "$(echo -e 'Enter your age: nb')"
输出:
Enter your age:
_
其中_是您请求输入的光标。
我的问题:如果删除\b开关,光标将不在换行符上。有人能向我解释一下这是怎么回事吗?
从$()
命令替换中删除尾随换行符。引用手册页:
命令替换允许命令的输出替换命令名称。有两种形式:
$(command)
或
`command`
Bash通过执行
command
并用命令的标准输出替换命令替换来执行扩展,并删除任何尾随换行符(…)
(强调矿)。
在没有b
的情况下实现相同行为的一种方法是使用bash特定的$''
字符串:
read -p $'Enter your age:n'
或者只是在一个带引号的字符串中放一条换行符:
read -p 'Enter your age:
'
格式不太好,但也可以。
(仅供参考,当我运行b
版本时,我的光标位于第一行的末尾,而不是第二行的开头,但这可能只是一个终端差异。)
举例来说,比较一下:
$ printf "$(echo -e 'Enter your age: n ')_" | xxd
0000000: 456e 7465 7220 796f 7572 2061 6765 3a20 Enter your age:
0000010: 0a20 5f . _
这个:
$ printf "$(echo -e 'Enter your age: nb')_" | xxd
0000000: 456e 7465 7220 796f 7572 2061 6765 3a20 Enter your age:
0000010: 0a08 5f .._
对此:
$ printf "$(echo -e 'Enter your age: n')_" | xxd
0000000: 456e 7465 7220 796f 7572 2061 6765 3a20 Enter your age:
0000010: 5f _
注意到第一个输出中的0a20
了吗?这是我们模式中的换行符和空格。
注意到第二个输出中的0a08
了吗?这是我们模式中的换行符和退格。
现在来看第三个输出。我们在换行符后面没有任何字符,所以在输出中看不到20
或08
,这是有道理的,但换行符去了哪里?
原来这是命令替换的一个"特性"。
Bash通过执行命令并用命令的标准输出替换命令替换来执行扩展,并删除任何尾随换行符。
因此,通过将b
放在换行符之后,可以保护它不被命令替换所删除。
Wintermute在他的回答中介绍了正确的解决方法/解决方案(你也可以把字符串放在一个变量中,并在read
行用引号展开它,以使该行的格式更好)。