假设我们有一个包含命令的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或经过时间)。
请注意,上面的脚本只是一个玩具示例。另外,假设它无法修改(将其视为黑盒子)。
答案 0 :(得分:4)
是。在脚本末尾添加wait
语句。这将导致该脚本“wait”以完成后台任务。
答案 1 :(得分:0)
这是Elliott Frisch和Gilles(在评论中)的答案的组合,旨在总结。
答案是创建一个包装脚本wrapper.sh
,如下所示:
#! /bin/sh
. $*; wait
.
(源命令)将强制作业在同一个shell中而不是在后台执行,wait
将等待所有子进程完成。
现在可以按以下方式运行:
/usr/bin/time ./wrapper.sh ./test.sh
请注意,使用source命令可以阻止您更改test.sh
的shebang行中的解释器。