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)
| 归档时间: |
|
| 查看次数: |
10171 次 |
| 最近记录: |