Bash 为什么“\b”作为echo中的最后一个字符不起作用?

Bash 为什么“\b”作为echo中的最后一个字符不起作用?,bash,Bash,当我在Mac上测试bash脚本时,您知道\b是DEL函数: $ echo -e "\\ 2\b" \ 2 $ echo -e "\\ 2\b123" \ 123 $ echo -e "\\ 2\b " \ 我发现如果\b作为最后一个字符,它将不起作用,请参见第一种情况。 但如果后面有空格或其他字符,它将起作用 编辑 对不起,\b不是DEL,这是退格,谢谢@Evert\b不代表DEL,它代表退格。这会将终端光标向后移动一个空间,但不会对已退格的字符执行任何操作。如果您在退格字符

当我在Mac上测试bash脚本时,您知道
\b
是DEL函数:

$ echo -e "\\  2\b"
\  2
$ echo -e "\\  2\b123"
\  123
$ echo -e "\\  2\b "
\   
我发现如果
\b
作为最后一个字符,它将不起作用,请参见第一种情况。 但如果后面有空格或其他字符,它将起作用


编辑


对不起,
\b
不是DEL,这是退格,谢谢@Evert

\b
不代表DEL,它代表退格。这会将终端光标向后移动一个空间,但不会对已退格的字符执行任何操作。如果您在退格字符后打印某些内容,则该内容将被写在上一个字符上(有效地删除它),但如果您不这样做,它将保留在屏幕上。如果确实要删除字符,请发送backspace+空格+backspace(即
“\b\b”

顺便说一句,
echo
不是这样打印序列的好方法。有些版本将转义序列转换为它们所表示的字符,但有些版本只是逐字打印转义。Mac OS X v10.5面世时,我不得不重写一堆脚本,行为与我预期的不同。从那以后,我总是喜欢
printf
来处理任何不寻常的事情。它比echo要复杂一点,因为第一个参数被视为格式字符串,用于控制其其余参数的打印方式。此外,它不会像echo那样在末尾自动添加换行符,因此如果需要,您必须手动添加它(使用
\n

最后,我会对包含转义序列的字符串使用单引号,因为在双引号中,一些转义序列在发送到命令之前会被shell解释(无论是
echo
还是
printf
)。下面是我如何做你的第二个例子:

printf '\\  2\b123\n'

这是向后移动的字符(退格),而不是
DEL
。因此,它将向后移动当前位置1个字符。当后面跟着另一个字符时,后一个字符将覆盖上一个字符。如果
\b
后面没有字符,则不会覆盖前面的字符。这就是你在这里看到的。