: 그런 all
아래에 들여 쓰기
FILES = $(shell ls)
, 그것은 빌드 명령입니다. 따라서 이것은 $(shell ls)
을 확장 한 다음 FILES ...
명령을 실행하려고 시도합니다. FILES
가 "ls
출력"으로 설정한다는 것을 의미 물론
FILES = $(shell ls)
all:
echo $(FILES)
: FILES
가 make
변수가 될 것으로 예상되는 경우
, 이러한 변수는 예를 들면, 레시피 부 외측 할당 받아야 전에 .tgz 파일을 만드는 명령을 실행하십시오. (Kaz notes으로 변수마다 팽창 재 있지만, 그래서 결국은 .TGZ 파일이 포함됩니다 일부는 변형 효율성 및/또는 정확성,이를 방지하기 위해 FILES := ...
을 가지고 있는지 확인 1합니다.)
FILES
인 경우 쉘 변수를해야하는데, 당신은 그것을 설정할 수 있지만 공백없이, 쉘 양반에 그것을 할 필요가 있고, 인용 : 그러나
all:
FILES="$(shell ls)"
는, 각 라인은 별도의 쉘에 의해 실행되기 때문에이 변수가 다음 줄까지 살아남지 않으므로 즉시 사용해야합니다.
쉘 명령과
echo *
: 쉘이 처음에 당신을 위해 *
(다른 쉘 글로브 식)를 확장하기 때문에 1,363,210
FILES="$(shell ls)"; echo $$FILES
이 그래서 그냥 할 수있는 모든 조금 바보입니다.
마지막으로, 일반적인 규칙 (이 예에 정말 해당되지 않음)과 같이 주석 esperanto로 노트, ls
의 출력을 사용하여 완전히 신뢰할 수 없습니다 (일부 세부 사항은 때때로 파일 이름과 ls
심지어 버전에 따라 일부 경우에 따라 ls
버전의 출력물을 위생적으로 처리하려고 시도합니다). 따라서 l0b0과 idelic으로 GNU make를 사용하는 경우 $(wildcard)
과 $(subst ...)
을 사용하여 make
내부의 모든 것을 수행 할 수 있습니다 ("파일 이름에 이상한 문자"문제가 발생하지 않음). (메이크의 레시피 부를 포함 sh
스크립트, 또 다른 방법 등 공백, 개행 제어 문자 걸려 넘어 피할 find ... -print0 | xargs -0
를 사용하고,.)
1The GNU Make documentation notes further that POSIX make added ::=
assignment in 2012.나는 이것에 대한 POSIX 문서에 대한 빠른 참조 링크를 찾지 못했고 make
변종이 ::=
할당을 지원하는 것을 알지 못했지만 GNU make는 현재 :=
과 동일한 의미로 즉, 지금 할당을합니다. 확장.
VAR := $(shell command args...)
은 현대의 모든 GNU 및 BSD 변형을 비롯하여 여러 개의 make
변형으로 철자를 넣을 수 있습니다. 이 다른 변종에는 $(shell)
이 없으므로 VAR != command args...
을 사용하면 더 짧은 변종 인 과이 더 우수합니다.
감사합니다. 나는 정교한 명령어 ('ss'와 함께'ls')를 사용하고 rsync와 다른 명령들에서 결과를 사용하고 싶습니다. 나는 긴 명령을 반복해서 반복해야만 하는가? 내부 Make 변수에 결과를 저장할 수 없습니까? –
Gnu make는 그렇게 할 수있는 방법이 있을지 모르지만 사용하지 않았고, 우리가 사용하는 모든 끔찍하게 복잡한 makefile은 쉘 변수와 거대한 한 줄짜리 쉘 명령어를 각 라인의 끝에 ";" 필요에 따라. (여기 백 슬래시 시퀀스로 작업하기위한 코드 인코딩을 얻을 수 없다, 흠) – torek
또한 [ls'] (http://mywiki.wooledge.org/ParsingLs) 대신 [' 와일드 카드'는 내장되어 있습니다.] (https://www.gnu.org/software/make/manual/make.html#Wildcard-Function). – l0b0