다음 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은 제3자가 제공하므로 나에게는 좋은 선택이 아닙니다.
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
). 대상 내에서 명령의 순서를 바꾸지 않습니다.