次のMakefileを使用すると、GNU makeは2つのコマンドを並行して実行します。最初のコマンドは完了するのに時間がかかるため、log
ファイルが作成される前にrm *.log
が実行されます。 、および失敗します。
dummy.pdf: dummy.tex
tex dummy.tex &> /dev/null;
rm *.log
ファイルdummy.tex
1行:\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.
実際には、makeには問題はありませんが、コマンドには問題があります。
tex dummy.tex &> /dev/null;
バックグラウンドで「tex」を実行します。 '>/dev/null'を削除する必要はありませんが、 '&'は 'tex'をバックグラウンドに送信しています。
これを試してください、それはあなたにとって問題ないはずです:
tex dummy.tex > /dev/null;
または、次のように、すべてを同じサブシェルで実行します。
(tex dummy.tex > /dev/null;rm *.log)
以下の正気、これ:
if test 1 = 1; then tex dummy.tex > /dev/null;rm *.log; fi
PD:&>は、stdoutとstderrの両方を同じ宛先にリダイレクトするために一部のシェル(bashを含む)によって提供される拡張機能ですが、移植性がないため、代わりに '>/dev/null 2>&1'を使用する必要があります。 (@Gillesに感謝)
乾杯
え? make
はターゲットを並列化します(-j
);ターゲット内のコマンドを並べ替えることはありません。