방금 Makefile의 문제를 해결했습니다. <<<
오류 메시지와 함께 모든 곳을 살펴보세요.
/bin/sh: 1: Syntax error: redirection unexpected
이유를 알고 싶습니다. (저는 Bash를 사용하고 있습니다 SHELL
)
현재 프로젝트에서 나는 많은 요리법을 시도했습니다.
target:
read FOO <<< "XXX"; \
read BAR <<< "YYY"; \
read BAZ <<< "ZZZ"; \
someprog -a param0 -b $$FOO -c param1 -d $${BAR} -e param2 -f $${BAZ} >$@
<<<
이를 시도하면 처음에 설명한 대로 모든 오류가 발생합니다 . 내 솔루션은
target.dep:
echo "XXX YYY ZZZ" >$@
target: %: %.dep
read FOO BAR BAZ < $<;\
someprog -a param0 -b $$FOO -c param1 -d $${BAR} -e param2 -f $${BAZ} >$@
이는 내 내용을 임시 파일에 넣은 다음 read 를 사용한다는 의미입니다 <
. 이는 훌륭하게 작동합니다. make 출력을 일반 bash 프롬프트에 복사하여 붙여넣으면 <<<
.<<<
왜 이런 일이 발생합니까? 이 문자열을 Makefile에서 작동하게 하는 방법이 있나요?
추신: 네, 가끔 저는 autotools가 make보다 낫다고 생각합니다.
답변1
/bin/sh: 1: Syntax error: redirection unexpected
당신은 의미아니요반대의 기대에도 불구하고 bash를 쉘로 사용하십시오. bash는 sh
여기에서 문자열을 잘 인식하지만( Makefile
Fedora에서 작업할 수 있도록) 예를 들어 dash는 sh
그렇지 않습니다. 별도로 지정하지 않는 한 Make는 /bin/sh
기본 사용자 쉘을 무시합니다.
환경
SHELL=/bin/bash
당신은 Makefile
당신을 위해 문제를 해결해야 합니다. 적어도 당신과 동일한 증상을 보이는 시스템에서는 나에게 도움이 되었습니다.
추신: 네, 가끔 저는 autotools가 make보다 낫다고 생각합니다.
Autotools와 Make는 동일한 문제를 해결하지 못하며, Autotools를 사용한다는 것은 여전히 Make를 사용한다는 것을 의미합니다.
답변2
오류 메시지에서 볼 수 있듯이 호출 쉘 make
은 bash
. 일반적으로 여기 문자열을 이해하지 못합니다./bin/sh
sh
make
변수를 (또는 시스템 의 해당 쉘에 대한 경로) SHELL
로 설정 하면 ./bin/bash
bash
sh
관련 GNU make
문서도 참조하세요:https://www.gnu.org/software/make/manual/html_node/Choosing-the-Shell.html