有没有办法测量 bash 文件中每个命令所花费的时间?因此,在每个命令前面都加上时间。目前命令的数量未知,因为我打算将来也使用这个时间测量方法来测量 bash 脚本。另外值得一提的是,我打算只运行具有命令 1、命令 2、命令 3 等的简单 bash 脚本。因此,没有复杂的高逻辑脚本。
假设我有一个类似于这个的 bash 文件:
#!/bin/bash
mv /path/to/file /other/path/
cd /other/path/
tar -xzf /other/path/file
有没有办法获得类似的输出?
6.553s mv /path/to/file /other/path/
0.057s cd /other/path/
19.088s tar -xzf /other/path/file
我知道time
我可以得到单个命令所花费的时间。但我正在寻找一种测量每个命令本身所用时间的解决方案。
答案1
您可以像以下示例一样使用/usr/bin/time
选项-f
。在 shellscript 中的每个命令前面加上/usr/bin/time -f "%E %C"
$ /usr/bin/time -f "%E %C" sleep 2.34
0:02.34 sleep 2.34
请参阅man time
此处了解更多详情。
例子:
我编写了一个小脚本,可以修改简单的shellscript 通过识别命令来测试,/usr/bin/time
让我们使用名称time2script
。
#!/bin/bash
string='/usr/bin/time -f "%E %C"'
while IFS= read -r line
do
cmd=$(<<< "$line" sed -e 's/ *//'|cut -d ' ' -f1)
command=$(which "$cmd")
if [ "$command" != "" ]
then
printf '%s %s\n' "$string" "$line"
else
printf '%s\n' "$line"
fi
done < "$1"
使用time2script
编辑问题中的示例:
$ ./time2script socrates1
#!/bin/bash
/usr/bin/time -f "%E %C" mv /path/to/file /other/path/
cd /other/path/
/usr/bin/time -f "%E %C" tar -xzf /other/path/file
重定向以创建修改后的 shellscript,
./time2script socrates1 > socrates1-timing
答案2
这是一种幼稚的方法。它有几个失败点*,所以我不一定建议使用它,只是想提一下。
#!/bin/bash
# Time each command in another Bash script.
script="$1"
# Skip blank lines and comments.
grep -vE "^\s*($|#)" "$script" |
while IFS= read -r line
do
echo "$line"
time eval "$line"
done
示例脚本foo.sh:
#/bin/bash
true
sleep 2.34
示例运行:
$ bash naive_timer.sh foo.sh
true
real 0m0.000s
user 0m0.000s
sys 0m0.000s
sleep 2.34
real 0m2.342s
user 0m0.000s
sys 0m0.000s
* 例如,eval
将对多行命令(如函数声明、数组声明、heredocs 甚至多行引号)造成阻塞。并且依赖于值的命令$0
可能无法工作。