5

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

4

3 回答 3

13

试试这个:

$ printf "12345678\rABC\n"
ABC45678

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

您可以像这样清除该行:

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

Usingtput为您提供了一种将控制字符发送到终端的便携方式。有关man 5 terminfo控制代码的列表,请参阅。通常,您需要将序列保存在变量中,这样您就不需要重复调​​用外部实用程序:

$ clear_eol=$(tput el)
$ printf "12345678\r${clear_eol}ABC\n"
ABC
于 2011-01-10T07:14:43.123 回答
1

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

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

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

于 2011-01-10T06:52:10.707 回答
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
于 2011-01-10T10:05:04.190 回答