我正在Linux Mint中运行一个shell脚本,它会在几分钟内调用一些进程。 对于每个进程,我想回显这样的消息:
echo "Cleaning temporary files... X seconds."
myprocess
其中X是当前经过的时间,我希望它每秒更改一次,但不打印新行。
有没有好办法呢?我只找到了最终打印总时间的方法,但没有找到运行过程所经过的时间。
答案 0 :(得分:8)
在脚本开头使用它,这将创建一个在后台运行的子进程,并不断更新状态。
file=$(mktemp)
progress() {
pc=0;
while [ -e $file ]
do
echo -ne "$pc sec\033[0K\r"
sleep 1
((pc++))
done
}
progress &
#Do all the necessary staff
#now when everything is done
rm -f $file
答案 1 :(得分:1)
您可以随时间运行每个命令:
time <command>
然后使用sed / awk来消除经过的时间。
答案 2 :(得分:1)
您必须在后台使用&
运行该过程,否则脚本的其余部分将一直等到它完成。使用退格键覆盖当前行,因此请确保不使用换行符。
所以,做你想做的事:
myproc &
myPid=$! # save process id
tmp=""
while true; do
if kill -0 "$myPid"; then # if the process accepts a signal, keep waiting
for i in {0..${#tmp}..1}; do
printf "%b" "\b" # print backspaces until we have cleared the previous line
done
tmp=$( printf "Cleaning temp files... %t seconds." )
printf "%s" "$tmp"
else
break # drop out of the while loop
fi
sleep 1
done
答案 3 :(得分:0)
这是一种每秒在STDERR上打印awk的方法。 你应该添加:
循环部分(没有终止测试......所以“无限循环”直到CTRL-C)是:
ping 127.0.0.1 | awk '
BEGIN{cmd="date +%s"; cmd|getline startup ; close (cmd) }
/bytes from/ { cmd | getline D ; close (cmd) ;
print D-startup | "cat >&2" }'
现在你只需要使用“printf”和ansi转义序列在没有换行符的情况下打印,让ansi-escape返回到数字的开头,并通过调用系统刷新输出(所有描述符):
ping 127.0.0.1 | awk -v getback4char="$(printf '\033[4D')" '
BEGIN{cmd="date +%s"; cmd|getline startup ; close (cmd) ; printf "Elapsed time: ";}
/bytes from/ { cmd | getline D ; close (cmd) ;
printf "%4d%s" ,(D-startup) , getback4char | "cat >&2"
system("") }'
注意:这与我所知道的awk的所有版本都兼容,即使是ANCIENT版本(也就是说,不仅仅是gawk / nawk,还有古老的awk。)