Bash中的退格

时间:2011-01-10 06:49:15

标签: bash backspace

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

3 个答案:

答案 0 :(得分:11)

试试这个:

$ 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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

这是使用find命令&的示例。一个while-read循环,只在一行上连续打印stdout的完整文件路径:

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