echo backspace开关创建换行符

时间:2015-04-16 13:25:35

标签: bash

我理解

\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开关,光标将在换行符上。有人可以向我解释这是如何工作的吗?

2 个答案:

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

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

原来这是一个"功能" Command Substitution

  

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

所以通过在后面添加\b ,您可以保护它不被命令替换删除。

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