回显退格符

34

在bash中,是否有可能输出一个退格符号?

类似这样:

echo $'stack\b'

输出不应该是stac吗?还是我有所遗漏?

更具体地说,我想在这里使用它:

ls | wc -l; echo $'\b items'
3个回答

50

\b让光标向左移动,但它不会擦除字符。如果你想要擦除字符,请输出一个空格。

对于某些发行版,您可能还需要使用echo-e开关:

  -e     enable interpretation of backslash escapes
所以它将看起来像:
 echo -e 'stack\b '

此外,files=(*) ; echo "${#files[@]} items"


嗯,当然不能在新行上使用退格键,对吧?这就是为什么我的初始解决方案没有起作用(我猜的)。感谢您提供的文件计数的好方法。如果可以的话,我会给+2分的 :-) - sidyll
1
为什么这种删除方法对于换行符不起作用? - Geremia
1
\b 会回退一个字符,直到终端的左边缘。换行符实际上是一个新行,因此第二行有自己的左边缘。 - Ignacio Vazquez-Abrams
echo -n 'test' => 没有换行符(即“-n”)。 - undefined

10

因此,回答关于退格键的实际问题,此操作将模拟一个退格键:

echo -e "\b \b"

它会将字符向后移动一个位置,然后回显一个空格,覆盖之前的任何字符,然后再次向后移动 - 实际上是删除先前的字符。但它不会回到上一行,因此在那之前的输出不应该创建新行:

echo -n "blahh"; echo -e "\b \b"

1

虽然不完全符合您的要求,但是在Ignacio的回答中,您可以使用以下方法:

echo "$(ls | wc -l) items"

据我所知,您无法打印一个删除前面字符的字符,甚至不能打印其十六进制数字对应于退格键的字符。但是,您可以向后移动并打印一个空格来删除。使用cput,您可以做很多事情,并在屏幕上打印任何位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接