Bash中的退格键功能

5
如何使用bash删除你刚写的一行并在同一位置输入新的一行? 我知道这是可能的,Aptitude(apt-get)用它来更新一些内容,看起来很不错。

你能给一个例子吗?因为我不太清楚你想要什么。 - Martin Trigaux
3个回答

13

试试这个:

$ printf "12345678\rABC\n"
ABC45678

如您所见,输出回车符会将光标移动到同一行的开头。

您可以使用以下方法清除该行:

$ printf "12345678\r$(tput el)ABC\n"
ABC

使用 tput 可以让您以一种便携的方式向终端发送控制字符。查看 man 5 terminfo 获取控制代码列表。通常,您需要将序列保存在变量中,这样就不必重复调用外部实用程序:

$ clear_eol=$(tput el)
$ printf "12345678\r${clear_eol}ABC\n"
ABC

谢谢,我发现tput正是我要找的。用它输出有点棘手,但还不错。 - Kyle Hotchkiss
我怎么从来没见过这个命令!我记得有一个大脚本,我实际上是在更尴尬的方式下使用控制字符。@KyleHotchkiss不要抱怨,看看控制字符是如何输出的这里(例如,在控制台中键入:echo -e '\033[1mbold\033[0m\033[4memphasis\033[0m')。 - Camilo Martin

1

我不是很清楚您想要什么,但是根据您的终端设置,您可以将^H(控制H)打印到屏幕上,这将使光标向后移动一个位置。

另外请注意,有些终端可以将光标移动到行的开头,在这种情况下,您可以移动到行的开头,打印足够的空格以覆盖整个行(通常从$COLUMNS中获得),然后打印任何消息或其他内容。

如果您明确了您想要什么,我可以回答您, 我会更新我的答案。


这是否允许您覆盖已经存在的东西,还是只能将已经存在的东西向下推送? - Kyle Hotchkiss
@Kyle:它将光标向后移动1个字符。 - JimR
@Kyle:它会覆盖。更具体地说,你所说的不是bash,而是终端,它可以是GUI应用程序、CRT终端驱动程序或实际物理终端。 - slebetman

1
这是一个使用find命令和while-read循环的示例,可以持续将完整文件路径打印到标准输出的单行上:
command find -x / -type f -print0 2>/dev/null | while read -d $'\0' filename; do 
   let i+=1
   filename="${filename//[[:cntrl:]]/}"   # remove control characters such as \n, \r, ...
   if [[ ${#filename} -lt 85 ]]; then
      printf "\r\e[0K\e[1;32m%s\e[0m  %s" "${i}" "${filename}"
   else
      printf "\r\e[0K\e[1;32m%s\e[0m  %s" "${i}" "${filename:0:40}.....${filename: -40}"
   fi
done; echo

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