如何在同一行显示和更新回显
我有以下在Bash(在Linux中)
for dir in Movies/* do (cd "$dir" && pwd|cut -d \/ -f5|tr -s '\n' ', ' >> ../../movielist && exiftool * -t -s3 -ImageSize -FileType|tr -s '\t' ',' >> ../../movielist ) echo "Movie $movies - $dir ADDED!" let movies=movies+1 done
但我希望这样做,“回声”在下一行显示下面的回声(不是与最后的回声输出连接,而是replace它),以使它看起来像它正在更新。 类似于百分比的进度条如何显示在同一行上。
那么我没有正确阅读这个man echo
页面。
回声有2个选项,如果我添加了第三个转义字符可以做到这一点。
2个选项是-n
和-e
。
-n
不会输出结尾的换行符。 所以每当我回应一些东西时,我就不用再换一个新的线了。
-e
将允许我解释反斜杠转义符号。
猜猜我想用什么逃生符号: \r
。 是的,回车会让我回到起点,它会看起来像我在同一行更新。
所以回声线看起来像这样:
echo -ne "Movie $movies - $dir ADDED!"\\r
我必须逃脱逃跑符号,所以Bash不会杀死它。 这就是为什么你在那里看到2个符号。
正如William提到的那样, printf
也可以做类似的(甚至更广泛的)这样的任务。
如果我理解的很好,你可以用下面这行代替你的echo:
echo -ne "Movie $movies - $dir ADDED! \033[0K\r"
下面是一个小例子,您可以运行它来了解其行为:
#!/bin/bash for pc in $(seq 1 100); do echo -ne "$pc%\033[0K\r" sleep 1 done echo
其余的答案是相当不错的,但只是想添加一些额外的信息,以防有人来这里寻找解决scheme,以取代/更新多线回声。
所以我想和大家分享一个例子。 在CentOS系统上尝试了以下脚本,并使用“timedatectl”命令,该命令基本上打印了系统的一些详细时间信息。
我决定使用该命令,因为它的输出包含多行,并且对于下面的示例非常适用:
#!/bin/bash while true; do COMMAND=$(timedatectl) #Save command result in a var. echo "$COMMAND" #Print command result, including new lines. sleep 3 #Keep above's output on screen during 3 seconds before clearing it #Following code clears previously printed lines LINES=$(echo "$COMMAND" | wc -l) #Calculate number of lines for the output previously printed for (( i=1; i <= $(($LINES)); i++ ));do #For each line printed as a result of "timedatectl" tput cuu1 #Move cursor up by one line tput el #Clear the line done done
以上将永远打印“ timedatectl
”的结果,并将更新结果replace以前的回声。
我不得不提的是,这个代码只是一个例子,但根据您的需要,可能不是最好的解决scheme。 几乎相同的命令(至less在视觉上)是“ watch -n 3 timedatectl
”。
但这是一个不同的故事。 🙂
希望有所帮助!