[英]echo backspace switch creates newline
我明白
\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开关,光标将不在换行符上。 有人可以向我解释这是如何工作的吗?
从$()
命令替换中删除尾随换行符。 手册页:
命令替换允许输出命令来替换命令名称。 有两种形式:
$(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: \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
哪个有意义但换行在哪里去了?
事实证明这是命令替换的“特征”。
Bash通过执行命令并用命令的标准输出替换命令替换来执行扩展,删除任何尾随换行符。
因此,通过在换行符之后放置\\b
,您可以保护它不被命令替换删除。
Wintermute在他的答案中涵盖了正确的解决方法/解决方案(你也可以将字符串放在变量中并在read
行的引号中展开它以使该行上的格式更好一些)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.