我理解
\n = new line or carriage return
\b = move cursor to the left once (does not delete anything)
当你把这两个放在这个命令中时:
read -p "$(echo -e 'Enter your age: \n\b')"
输出:
Enter your age:
_
当你的光标要求输入时。
我的问题:如果我移除\ b开关,光标将不在换行符上。有人可以向我解释这是如何工作的吗?
答案 0 :(得分:5)
从$()
命令替换中删除尾随换行符。请参阅联机帮助页:
命令替换允许输出命令来替换命令名称。有两种形式:
$(command)
或
`command`
Bash通过执行
command
并使用命令的标准输出替换命令替换来执行扩展,删除任何尾随换行符。(...)
(强调我的)。
在没有\b
的情况下实现相同行为的一种方法是使用特定于bash的$''
字符串:
read -p $'Enter your age:\n'
或者只是在引用的字符串中添加换行符:
read -p 'Enter your age:
'
格式不是很好,但它也可以。
答案 1 :(得分:1)
(仅在我运行你的\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: \n\b')_" | 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
哪个有意义但换行符在哪里?
原来这是一个"功能" Command Substitution。
Bash通过执行命令并用命令的标准输出替换命令替换执行扩展,删除任何尾随换行符。
所以通过在后面添加\b
,您可以保护它不被命令替换删除。
Wintermute在他的答案中涵盖了正确的解决方法/解决方案(您也可以将字符串放在变量中并在read
行的引号中展开它,以使该行的格式更好一些)。