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