测量 bash 文件中的每个命令?

测量 bash 文件中的每个命令?

有没有办法测量 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可能无法工作。

相关内容