echo退格开关创建换行符



我了解

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

现在来看第三个输出。我们在换行符后面没有任何字符,所以在输出中看不到2008,这是有道理的,但换行符去了哪里?

原来这是命令替换的一个"特性"。

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

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

Wintermute在他的回答中介绍了正确的解决方法/解决方案(你也可以把字符串放在一个变量中,并在read行用引号展开它,以使该行的格式更好)。

相关内容

  • 没有找到相关文章

最新更新