假设我们有一个包含命令的bash脚本,其中一些命令可以具有与号(&
)符号。我想使用/usr/bin/time来测量这样一个脚本的执行时间,但由于使用了"与"符号,实际工作是在后台完成的,而脚本将命令返回到shell,结果测量值等于零。
有没有办法抑制"与"的行为(即不让命令在后台运行)?
我之所以尝试这样做,是因为我想做一个大规模的基准测试(大量的数据集和多个工具(其中一些表现出这种行为))。
一个具体的、非常简单的例子如下。
创建包含以下内容的脚本test.sh
:
#! /bin/sh
sleep 2 &
试着用运行它
/usr/bin/time ./test.sh
结果是:
0.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 668maxresident)k
0inputs+0outputs (0major+219minor)pagefaults 0swaps
预期的结果大约是2秒(cpu或运行时间)。
请注意,上面的脚本只是一个玩具示例。此外,假设它不能被修改(将其视为一个黑框)。
是。在脚本末尾添加一个wait
语句。这将导致该脚本"等待"后台任务完成。
这是Elliott Frisch和Gilles(在评论中)的回答的组合,旨在总结问题。
答案是创建一个包装脚本wrapper.sh
,看起来像:
#! /bin/sh
. $*; wait
.
(源命令)将强制作业在同一shell中执行,而不是在后台执行,wait
将等待所有子流程完成。
现在可以运行为:
/usr/bin/time ./wrapper.sh ./test.sh
请注意,使用source命令可以防止您更改test.sh
的shebang行中的解释器。