在 bash 函数(不是命令)上使用时间

Zak*_*akC 7 shell-script function time

如何从bash 文件内部测量对 bash 函数的单个调用。

我有一个使用命令调用的程序

eclipse -b col_solve.pl -e "myPred"
Run Code Online (Sandbox Code Playgroud)

这个调用输出一些信息,最后一个是 SUCCESS 或 FAIL。我正在编写一个脚本,该脚本在目录中的一堆文件上调用,对于这些文件中的每一个,输出

  • 名字
  • 状态(成功或失败)
  • 以及执行所需的(用户)时间。

这是我知道有效的代码:

我用它来获取状态(检索输出中的最后一个单词):

stat=
get_stat ( ){
    stat=$(awk '{print $NF}' <<< $1);
}
Run Code Online (Sandbox Code Playgroud)

我用它来调用程序:

run_eclipse_on ( ){
    get_stat "$(eclipse -b col_solve.pl -e "run(\"$1\")" )";
}
Run Code Online (Sandbox Code Playgroud)

有问题的代码如下:

for i in `ls $1` ;  #where $1 is the directory containing the files
do
    tps=$(/usr/bin/time -f %U      \ #to get just the user time
         [run_eclipse_on $1/$i] ); # HERE it is! 
    echo $i::$stat::::$tps;  # gives, for ex: file_name::SUCCESS::::0.20
done
Run Code Online (Sandbox Code Playgroud)

罪魁祸首是调用函数的那一行。我尝试用 `, {, [, $(, ' 和 " 包围它。没有任何效果......

甚至有可能吗……?

Gil*_*il' 10

使用time关键字而不是外部命令。使用关键字允许您运行time任何 shell 命令,包括函数调用,而不仅仅是运行程序。可以通过TIMEFORMAT变量在一定程度上控制输出格式。

TIMEFORMAT=%2U
time run_eclipse_on …
echo "$i::$stat"
Run Code Online (Sandbox Code Playgroud)

不过,time输出会打印在自己的行上。Bash 提供了一个技巧:您可以TIMEFORMAT在命令期间进行更改,因此您可以在其中填充更多内容。

time { run_eclipse_on …; TIMEFORMAT="${i//%/%%}::${stat//%/%%}::%2U"; }
Run Code Online (Sandbox Code Playgroud)

的输出time打印为标准错误。如果您需要在标准输出上使用它,只需使用2>&1. 但是,这也将重定向 stderr 上打印的任何命令。为了保留标准错误,您可以进行一些文件描述符改组

{ time { {
      run_eclipse_on …;
      TIMEFORMAT=$stat::%2U;
    } 2>&3; } 2>&1; } 3>&2
Run Code Online (Sandbox Code Playgroud)