$ bash -version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
다음 쉘 스크립트를 고려하십시오.
#!/bin/bash
declare -A PROVS=( ["NL"]=10 ["PE"]=11 ["NS"]=12 ["NB"]=13 ["QC"]=24 ["ON"]=35 ["MB"]=46 ["SK"]=47 ["AB"]=48 ["BC"]=59 ["YK"]=60 ["NT"]=61 ["NU"]=62 )
for key in "${!PROVS[@]}" ; do \
touch "foo_${key}_${PROVS[${key}]}" ; \
done
Makefile에서 동등한 작업을 시도하고 있습니다.
SHELL := /bin/bash
.PHONY: foo
foo:
declare -A PROVS=( ["NL"]=10 ["PE"]=11 ["NS"]=12 ["NB"]=13 ["QC"]=24 ["ON"]=35 ["MB"]=46 ["SK"]=47 ["AB"]=48 ["BC"]=59 ["YK"]=60 ["NT"]=61 ["NU"]=62 )
for key in "$${!PROVS[@]}" ; do \
touch "foo_$${key}_$${PROVS[$${key}]}" ; \
done
나는 정말로touch
파일을 원하지 않는다 . 나는 할 수 없기 때문에 이것을하고 있습니다 @echo
-@는 루프에 있기 때문에 줄의 시작 부분에있는 것으로 보이지 않을 것입니다. 아니면 그것이 일어나고있는 것처럼 보입니다.
어쨌든 요점은 루프가 전혀 실행되지 않는 것처럼 보이기 때문에 touch
/ echo
비즈니스입니다. 위의 쉘 스크립트의 내용은 make
터미널에 정확히 반영 되는 내용입니다 . 나는 shebang을 추가하고 온 전성 검사로 실행했습니다. 매력처럼 작동합니다.
일반 배열을 사용하면 잘 작동합니다.
for prov in NL PE NS NB QC ON MB SK AB BC YK NT NU ; do \
그러나 해당 코드 (10, 11 등)도 필요합니다.
누구든지 이것에 대한 통찰력이 있습니까?
필요하지는 않지만 "declare -A"를 사용하면서 파일 맨 위에 PROVS 변수를 할당하는 방법 (또는 가능한 경우)도 알고 싶습니다.
편집 : 나는 Makefile 예제를 엉망으로 만들어서 인라인 쉘 명령이었고 더 이상 레시피가 아닙니다. 명확히하기 위해 "foo :"대상을 다시 추가했습니다.
코드 발췌가 적절하게 대표적이라면 Makefile에 직접 Bash 명령을 입력하고 Make가 Bash로 실행할 것으로 예상하는 것 같습니다. 그것이 작동하는 방식이 아닙니다. Makefile의 구문은 완전히 다릅니다. 레시피 내 에서 Bash 명령을 입력 할 수 있습니다. 레시피의 각 개별 라인은 별도의 하위 쉘에서 실행됩니다. 따라서 최소한 두 가지 변경이 필요합니다.
declare
루프와 같은 쉘에서 실행해야합니다; 그렇지 않으면 declare
하나의 Bash 인스턴스에서 종료 한 다음 지금 잃어버린 것에 대해 아무것도 모르는 별도의 인스턴스에서 루프를 실행하십시오 declare
.다음은 이러한 변경 사항을 적용한 Makefile의 간단한 리팩토링입니다.
SHELL=/bin/bash # This is the standard compliant method
.PHONY: all
all:
declare -A PROVS=( ["NL"]=10 ["PE"]=11 ["NS"]=12 ["NB"]=13 \
["QC"]=24 ["ON"]=35 ["MB"]=46 ["SK"]=47 ["AB"]=48 \
["BC"]=59 ["YK"]=60 ["NT"]=61 ["NU"]=62 )\
; for key in "$${!PROVS[@]}" ; do \
touch "foo_$${key}_$${PROVS[$${key}]}" ; \
done
@
자동으로 명령을 실행하는 규칙은 전체 명령 행에 적용됩니다. 따라서 declare
위의 앞에 넣을 수 있으며,이 경우 전체 명령 줄이 Bash에 제출되기 전에 제거됩니다. 다른 곳에서는 제거되거나 이해되지 않으며 호출 된 셸에서 Bash 구문 오류가 발생합니다.
( @
규칙에 대한 집착 은 어쨌든 안티 패턴입니다. make -s
출력을보고 싶지 않으면 실행하십시오 . 종료 make
하면 규칙을 디버그하기가 더 어려워집니다.)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다