在CentOS中,我使用:
[root@localhost sbin]# echo -e "ab\bc"
ac
表示\b
退格键。
但是当我使用时:
[root@localhost sbin]# echo -e "abc\b"
abc
打印出来了abc
,为什么不退格?
答案1
退格键本身并不具有破坏性,尽管大多数编辑器(甚至命令行)确实使它看起来如此。真正发生的情况是,这些程序在交互时会备份光标,然后写入一个空格,然后再次备份以正确定位光标。
所以你的线路可能是echo -e "abc\b \b"
并且它会起作用。
您可以通过执行以下操作来测试这一点echo -n -e "abc\b"
(-n 删除自动跳转到下一行)。您的提示现在将覆盖“c”。
这有点类似于\n
“which 表示转到下一行(但不到边距)”和“ \r
which 表示转到边距(但不到下一行)”。操作系统对这些字符的解释不同(Unix 在 \n 中添加下一行,DOS 有这两个字符,等等)。
答案2
是的,这按预期工作(x 字符被删除):
$ echo -e 'ax\bc'
ac
是的,它“看起来像”退格字符因此丢失了:
$ echo -e 'abx\b'
abx
请注意,退格字符 ( \b
) 与键盘按键不同Backspace。
键盘Backspace上打印^?
有Ctrl-VBackspace.
许多编辑将其解释为后退并删除字符。这比仅仅打印一个空格要复杂得多,对于每个擦除的字符,右侧的整行需要向左移动一个空格(对于宽字符,需要移动两个空格,对于控制字符则需要移动零),或者,如果删除的字符是一个新行,将整行向上移动一行。不,那不是一个简单的字符,它是连接到键盘按键的整个程序Backspace。
然而,不,退格字符实际上被写入控制台。
您可以使用以下命令查看正在传输到控制台的内容od
:
$ echo -e 'abx\b' | od -vAn -tx1c
61 62 63 08 0a
a b x \b \n
那么,会发生什么呢?
- 该字符串
abx
被写入控制台。 - 控制台打印
abx
到行缓冲区。 - 该角色
\b
被写入控制台。 - 该字符
\b
导致控制台行缓冲区后移一个字符。 - 该字符
\n
被打印到控制台。 - 控制台行缓冲区移动到下一行(不打印任何内容)。
- “字符串结尾”被打印到控制台。
- 控制台输出整行缓冲区。
这是控制台的默认工作方式。
看看这个:
$ printf 'abcdef\b\b\b \n'
abc ef
该字符d
是被空格替换的字符。
为什么要'ax\bc'
删除x?
因为c
字符会覆盖字符x
。