强制 GNU make 按顺序运行命令

Bru*_*och 6 make parallelism

使用以下 Makefile,GNU make 并行运行这两个命令。由于第一个需要时间才能完成,rm *.log因此在log创建文件之前运行,并且失败。

dummy.pdf: dummy.tex
    tex dummy.tex &> /dev/null;
    rm *.log
Run Code Online (Sandbox Code Playgroud)

文件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.
Run Code Online (Sandbox Code Playgroud)

D4R*_*RIO 11

实际上,您对 make 没有问题,但是您的命令有问题:

tex dummy.tex &> /dev/null;
Run Code Online (Sandbox Code Playgroud)

在后台运行 'tex'。您不需要删除 '>/dev/null',但 '&' 正在向后台发送 'tex'。

试试这个,对你来说一定没问题:

tex dummy.tex > /dev/null;
Run Code Online (Sandbox Code Playgroud)

或者在同一个子shell中运行所有内容,如下所示:

(tex dummy.tex > /dev/null;rm *.log)
Run Code Online (Sandbox Code Playgroud)

或者不那么理智,这个:

if test 1 = 1; then tex dummy.tex > /dev/null;rm *.log; fi
Run Code Online (Sandbox Code Playgroud)

PD: &> 是一些 shell(包括 bash)提供的扩展,用于将 stdout 和 stderr 重定向到同一目的地,但它不可移植,您应该使用 '>/dev/null 2>&1' 代替。(感谢@Gilles)

干杯

  • @Bruno:`&>` 是一些 shell(包括 bash)提供的扩展,用于将 stdout 和 stderr 重定向到同一目的地,但它不可移植。很可能 Makefile 的作者将 bash 作为他的 `/bin/sh`,但是你有不支持这种语法的 ash 或 ksh。 (8认同)
  • 是的,但是,你应该使用 '>/dev/null 2>&1' 代替 (2认同)