如何测量shell脚本的每个“子进程”的执行时间

时间:2017-09-11 23:45:40

标签: bash shell automation

我正在通过脚本多次运行程序,但我需要获得执行每次运行它的时间。我正在尝试使用“时间”功能,就像我通过终端使用它一样,但它并没有真正起作用。这是我在脚本中使用“time”函数的代码:

#!/bin/sh
time ./tree < in_1.in > out_1.out
time ./tree < in_2.in > out_2.out
time ./tree < in_3.in > out_3.out
time ./tree < in_4.in > out_4.out
time ./tree < in_5.in > out_5.out
time ./tree < in_6.in > out_6.out
time ./tree < in_7.in > out_7.out
time ./tree < in_8.in > out_8.out
time ./tree < in_9.in > out_9.out
time ./tree < in_10.in > out_10.out

注1:在每行之前没有“时间”,脚本运行完美。如果可能的话,我想把每个记录的时间都放到一个新文件中,我尝试使用“echo”,但是没有任何运气。

注意2:有没有办法让我的脚本与目录中的每个文件一起运行,而没有专门将每个文件都放在我的脚本中?

1 个答案:

答案 0 :(得分:1)

bourne shell中没有time命令(/bin/sh)。使用#!/bin/bash运行您的程序。

您可以将记录的时间写入新文件,如下所示:

time ./tree < in_1.in > out_1.out 2> time_1.time

或者如果你想要在outfile中的时间:

time ./tree < in_1.in &> out_1.out

为每个.in文件运行功能的一种非常基本的方法是使用循环和路径名扩展(使用*通配符):

for filename in *.in
do
    time ./tree < "$filename" > "$( sed -e 's/in/out/g' <<< $filename )"
done

表达式"$( sed -e 's/in/out/g' <<< $filename )"已扩展为在in中将out替换为$filename的结果。它周围的双引号可防止全局字符(*?)和文件名中的换行符破坏您的代码。

sed是一个非常常见的工具,但使用仅Bash 模式替换可以更短地编写替换(请注意第一个参数之后的双/等于g中的sed修饰符触发替换模式的所有匹配项:)

time ./tree < "$filename" > "${filename//in/out}"

对工作目录中或工作目录下的一组文件执行命令的另一种常见方法是使用find -exec,由于重定向,在这种情况下可能很难。