次のMakefileを使用して、GNU makeはこれら2つのコマンドを並列に実行します。最初の操作は完了するのに時間がかかるため、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;
または、次のように同じサブシェルですべてを実行します。
(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'を使用する必要があります。 (@gilsに感謝)
乾杯
答え2
よく? make
ターゲットを並列化します(使用-j
)。ターゲット内でコマンドの順序を変更しません。