Bash中的退格

Bash中的退格,bash,backspace,Bash,Backspace,如何将刚刚用bash编写的行退格,并在其位置上放置一个新的行?我知道这是可能的,Aptitude(apt get)将其用于一些更新内容,它看起来很棒。我不太清楚您想要什么,但是,根据您的终端设置,您可以将^H(控件H)打印到屏幕上,这将使光标后退一个位置 还要注意的是,有些终端能够将光标移动到行首,在这种情况下,您可以移动到行首,打印足够的空间覆盖整行(通常从$COLUMNS获得),然后打印任何消息或其他内容 如果你明确你想要什么,我可以回答你,我会更新我的答案。试试这个: $ printf "

如何将刚刚用bash编写的行退格,并在其位置上放置一个新的行?我知道这是可能的,Aptitude(apt get)将其用于一些更新内容,它看起来很棒。

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

还要注意的是,有些终端能够将光标移动到行首,在这种情况下,您可以移动到行首,打印足够的空间覆盖整行(通常从$COLUMNS获得),然后打印任何消息或其他内容

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

试试这个:

$ 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

下面是一个示例,使用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

这是否允许您在已经存在的内容上进行书写,或者只是将已经存在的内容向下推?@Kyle:它将光标向后移动1个字符。@Kyle:它将覆盖。更具体地说,你说的不是bash,而是终端,它可以是gui应用程序,也可以是CRT终端驱动程序,也可以是实际的物理终端。你能举一个例子说明你想要什么吗,因为它对Methank的人来说并不清楚。我发现tput正是我想要的。用它输出有点尴尬,但这很酷。为什么我从来没有见过这个命令!我记得有一个大剧本,我实际上用了更笨拙的方式来使用控制字符@KyleHotchkiss不要抱怨,看看控制字符是如何输出的(例如在控制台中键入:
echo-e'\033[1mbold\033[0m\033[4M\033[0m'