나는 makefile 규칙에서 echo
, mv
, , if
와 같은 것을 보았습니다. for
일종의 쉘 명령이 인식되는 것 같습니다. 이게 카니발인가요? 어떤 셸이 사용되고 있는지와 사용 가능한 키워드의 전체 목록을 어떻게 알 수 있나요?
답변1
그런 다음 실행 라인은 인수로 전달된 것처럼 쉘에 의해 실행됩니다.체계()상호 작용
system()
sh
다음 키워드를 사용할 수 있습니다 .POSIX 쉘 명령 언어, 호스트 플랫폼에서 사용할 수 있기를 원하는 키워드가 아닌 명령.
sh
실제로는 시스템의 다른 셸(예 bash
: )에 대한 또 다른 이름일 수 있으며, 이 경우 더 많은 옵션을 사용할 수 있습니다. 그러나 이 makefile은 이식 가능하지 않습니다.
GNU make에 대해 구체적으로 질문할 때 나는 또한 GNU make를 통해 다음을 수행할 수 있다는 점을 언급했습니다.다른 쉘 지정makefile에서 사용되지만, makefile은 make
POSIX 규정에 따라 sh
기본적으로 사용됩니다.
답변2
여러분도 꼭 살펴보세요PolyGlot 생성 파일, 특정 makefile 대상에 대한 쉘 선택에 대한 간략한 설명입니다.
여기서 bash라는 대상에 대해 bash가 선택되었습니다.
.ONESHELL:
bash: SHELL := bash
bash:
# note: the double dollar-sign is required because Make substitues $variables
export greeting="¡hola"
echo "$${greeting}, bash!"
이것은 단지 자랑하기 위한 것입니다:
.ONESHELL:
python: SHELL := python3
python:
greeting = "hello"
print(f"{greeting}, python!")
그런 make python
다음 "Hello, python!"을 인쇄합니다.
답변3
@Michael(+1)이 모든 것을 말했고 세부 사항에 대한 지침을 제공했습니다. 그럼에도 불구하고, 나는 두 가지 세부 사항을 강조하고 싶습니다(수정해 주십시오):
액션을 생성하려면 "sh"를 사용하세요
gnumake에 유용하다면 쉘을 재정의할 수 있습니다.
쉘 = 배쉬
그리고 bash 트릭을 사용하십시오.
(UNIX 기반 환경에서) --
mv
는echo
명령(모든 쉘에서 사용할 수 있음)if
이며for
sh/bash 종속성입니다.쉘은 인용(그리고 glob 및 var 확장...)과 관련하여 다른 동작을 가지며
make
몇 가지 특별한 동작도 있습니다.Windows 등에서는 gnumake 명령과 함께 일종의 Unix 생존 도구 키트(sh/bash, 일부 필터, fileutils 및 일반적으로 make 작업에 사용되는 명령)를 설치하는 것이 유용할 수 있습니다.