【发布时间】:2014-10-19 17:54:29
【问题描述】:
我正在尝试为命令行编写任务运行程序。没有道理。只是想这样做。基本上它只是运行一个命令,将输出存储在一个文件中(而不是标准输出),同时在标准输出上打印一个进度指示器,当它全部完成后,打印Completed ($TIME_HERE)。
代码如下:
#!/bin/bash
task() {
TIMEFORMAT="%E"
COMMAND=$1
printf "\033[0;33m${2:-$COMMAND}\033[0m\n"
while true
do
for i in 1 2 3 4 5
do
printf '.'
sleep 0.5
done
printf "\b\b\b\b\b \b\b\b\b\b"
sleep 0.5
done &
WHILE=$!
EXECTIME=$({ TIMEFORMAT='%E';time $COMMAND >log; } 2>&1)
kill -9 $WHILE
echo $EXECTIME
#printf "\rCompleted (${EXECTIME}s)\n"
}
我承认里面有一些不必要的花哨的东西。但是我经历了大量的 StackOverflow 问题来做不同类型的花哨的东西只是来尝试一下。如果将其应用于任何地方,可以减少大量脂肪。但事实并非如此。
应该这样称呼:
task "ping google.com -c 4" "Pinging google.com 4 times"
它会用黄色打印Pinging google.com 4 times,然后在下一行打印一个句点。然后每隔 0.5 秒打印一个周期。五个周期后,从同一行的开头开始并重复此操作,直到命令完成。然后它应该打印Complete ($TIME_HERE)(显然)代替$TIME_HERE执行命令所花费的时间。 (我已经把那部分注释掉了,当前版本只会打印时间)。
问题
问题在于,打印出来的不是执行时间,而是一些非常奇怪的东西。这可能是我正在做的愚蠢的事情。但我不知道这个问题是从哪里来的。这是输出。
$ sh taskrunner.sh
Pinging google.com 4 times
..0.00user 0.00system 0:03.51elapsed 0%CPU (0avgtext+0avgdata 996maxresident)k 0inputs+16outputs (0major+338minor)pagefaults 0swaps
在终端中运行 COMMAND='ping google.com -c 4';EXECTIME=$({ TIMEFORMAT='%E';time $COMMAND >log; } 2>&1);echo $EXECTIME 按预期工作,即打印出时间(在我的情况下为 3.559 秒。)
我已经检查过了,/bin/sh 是指向dash 的符号链接。 (但这应该不是问题,因为我的脚本按照顶部的 shebang 在 /bin/bash 中运行。)
我希望在解决这个问题的同时学习,所以有解释的解决方案会很酷。谢谢。 :)
【问题讨论】: