通过以下 Makefile,GNU make 并行运行这两个命令。由于第一个需要时间才能完成,在创建文件rm *.log
之前运行,并且失败。log
dummy.pdf: dummy.tex
tex dummy.tex &> /dev/null;
rm *.log
文件dummy.tex
一行:\bye
(TeX 的一个简短的空文件)。用任何其他命令替换tex dummy.tex
都会显示相同的行为。删除&> /dev/null
当然可以解决问题,但对我来说这不是一个很好的选择,因为 Makefile 是由第三方提供的。
是否可以阻止 GNU make 并行执行任何操作? (该标志-j 1
没有帮助)。
编辑:输出到终端:
bruno@bruno-laptop:~/LaTeX/make-experiment$ make
tex dummy.tex &> /dev/null;
rm *.log
rm: cannot remove `*.log': No such file or directory
make: *** [dummy.pdf] Error 1
bruno@bruno-laptop:~/LaTeX/make-experiment$ This is TeX, Version 3.1415926 (TeX Live 2009/Debian)
(./dummy.tex )
No pages of output.
Transcript written on dummy.log.
答案1
实际上,你的 make 没有问题,但你的命令有问题:
tex dummy.tex &> /dev/null;
在后台运行“tex”。您不需要删除“>/dev/null”,但“&”正在将“tex”发送到后台。
试试这个,它一定适合你:
tex dummy.tex > /dev/null;
或者在同一个子 shell 中运行所有内容,如下所示:
(tex dummy.tex > /dev/null;rm *.log)
或者不太理智的是,这个:
if test 1 = 1; then tex dummy.tex > /dev/null;rm *.log; fi
PD: &> 是某些 shell(包括 bash)提供的扩展,用于将 stdout 和 stderr 重定向到同一目的地,但它不可移植,您应该使用 '>/dev/null 2>&1' 代替。 (谢谢@吉尔斯)
干杯
答案2
呃? make
并行化目标(使用-j
);它从不重新排序目标内的命令。