繁体   English   中英

echo backspace开关创建换行符

[英]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 这是我们模式中的换行符和退格键。

现在看第三个输出。 换行后我们没有任何字符,所以我们在输出中没有看到2008哪个有意义但换行在哪里去了?

事实证明这是命令替换的“特征”。

Bash通过执行命令并用命令的标准输出替换命令替换来执行扩展,删除任何尾随换行符。

因此,通过在换行符之后放置\\b 您可以保护它不被命令替换删除。

Wintermute在他的答案中涵盖了正确的解决方法/解决方案(你也可以将字符串放在变量中并在read行的引号中展开它以使该行上的格式更好一些)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM