/bin/sh
수 있습니다 bash
시스템에 있지만, 같은 호출 할 때 sh
, bash
(것처럼 POSIX 모드에서 실행됩니다 POSIXLY_CORRECT
정의, 또는이 시작되었다 --posix
).
이 모드에서는 프로세스 대체가 없습니다.
솔루션 :
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
대안 :
all:
bash -c "diff <(command1) <(command2)"
또는 Makefile 변수 SHELL
를 /bin/bash
다음 과 같이 정의하십시오 .
SHELL=/bin/bash
이식성을 원한다면 첫 번째 해결책으로 가십시오. 에 대한 종속성이 있으면 bash
두 번째를 선택하십시오. 비 GNU make
구현 에 대해 추가로 신경 쓸 필요가 없다면 세 번째를 사용하십시오.
설정 관련 SHELL
: POSIX 표준에 따르면 Makefile의 실행 파일은 system()
C 라이브러리 함수를 사용하여 호출해야합니다 make
. 이 함수는 SHELL
환경 변수 를 사용한다고 보증하지 않습니다 (사실 표준에서는 권장하지 않습니다). 또한 표준은 Makefile 변수를 설정 SHELL
하면 환경 변수에 영향을 미치지 않아야 한다고 말합니다 SHELL
. make
그러나 내가 아는 대부분의 구현 에서 Makefile 변수 SHELL
는 명령을 실행하는 데 사용됩니다.
유틸리티 에 대한 이론적 근거make
는 다음을 사용하는 것입니다 bash -c
.
역사적 MAKESHELL
특징 및 다른 make
구현 에 의해 제공된 관련 특징 은 생략되었다. 일부 구현에서는 사용자가 make
명령 을 실행하는 데 사용되는 셸을 무시하도록하는 데 사용됩니다 . 이것은 혼란 스러웠다. 휴대용의 make
경우, 쉘은 makefile 작성기에서 선택해야합니다. 또한, makefile 작성기는 대체 쉘을 사용할 것을 요구할 수 없으며 makefile을 이식 가능한 것으로 간주합니다. 대체 쉘을 지정하기위한 메커니즘을 표준화 할 수는 있지만 기존 구현에서는 이러한 메커니즘에 동의하지 않으며 makefile 작성자는 대상 규칙에 쉘 이름을 지정하여 대체 쉘을 이미 호출 할 수 있습니다. 예를 들면 다음과 같습니다.
python -c "foo"
bash
임시 파일을 사용하지 않고 Makefile 또는 diff 문제에 대한 다른 솔루션 을 호출하는 방법이 있습니까?