为什么\b最后不退格?

为什么\b最后不退格?

在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 表示转到下一行(但不到边距)”和“ \rwhich 表示转到边距(但不到下一行)”。操作系统对这些字符的解释不同(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

那么,会发生什么呢?

  1. 该字符串abx被写入控制台。
  2. 控制台打印abx到行缓冲区。
  3. 该角色\b被写入控制台。
  4. 该字符\b导致控制台行缓冲区后移一个字符。
  5. 该字符\n被打印到控制台。
  6. 控制台行缓冲区移动到下一行(不打印任何内容)。
  7. “字符串结尾”被打印到控制台。
  8. 控制台输出整行缓冲区。

这是控制台的默认工作方式。

看看这个:

$ printf 'abcdef\b\b\b \n'
abc ef

该字符d是被空格替换的字符。

为什么要'ax\bc'删除x?

因为c字符会覆盖字符x

相关内容