2010-11-20 79 views
1

我正在编写一个shell脚本,它遍历一组变量,根据当前迭代值逐行编辑源文件,然后重新制作,最后调用just编译二进制。执行后,旧线路被恢复。从bash脚本调用make不会使

这里是一个片段:

#!/bin/sh 
for i in 0..4; do 
    perl -i -pe "s/.*/{SUBS[$i]}/ if $. == ${LINE[$i]}" ${SOURCE} 
    make 
    ./bin/myTool 
    perl -i -pe "s/.*/\/\/{SUBS[$i]}/ if $. == ${LINE[$i]}" ${SOURCE} 
done 

基本上我有大约10相互在C++源文件的独占#define,并且我每个试验的影响。因为我很懒,所以我想让它成为一个自动化的过程,在这里我卡住了。

有时候碰巧壳说:

`make: Nothing to be done for 'all'` 

现在,我试图diff文件每perl指令前,后和文件也显示正确的......我不明白为什么会这样以及如何使其行为正确。

有什么想法?

预先感谢您。

+0

修正了,这个错误完全是我的。我添加了“睡眠”指令,但肯定是在错误的地方......只是把它放在循环的开始处(正如答案中所述),一切都很顺利。谢谢! – Daniele 2010-11-22 12:09:02

+0

脚本的最后一个版本:我不想睡觉,我更愿意'touch -t 1010101010 $ {SOURCE} $ {OBJECT}'......浪费更少的时间! :) – Daniele 2010-11-22 15:01:48

回答

2

它可能循环太快,使告诉每个迭代分开。要么删除制造产品,要么在循环的开始或结束时添加2秒的延迟时间。

+0

我试过两种方法,但都没有正常工作。 首先我在'make'前面加上'touch $ {SOURCE}',但没有任何明显的改变; 'make clean && make'似乎在工作,但我不想相信每次都必须重建所有东西。 我也尝试删除'.o',但仍然没有消息。 “睡3s”仍然无法完成这项工作。 看起来好像每一行都是在自己的线程中启动的,因此这种异步行为(哦,我试图“等待”,但没有成功)。 – Daniele 2010-11-20 13:42:53

1

仅检查目标时间戳是否小于源时间戳。这是它知道需要更新的唯一途径。所以,如果循环迭代花费的时间少于一秒,那么make就不会知道任何事情已经改变。

您可以在每次迭代的顶部进行清理,或者像Ignacio Vazquez-Abrams指出的那样添加延迟。