일부 변수를 설정 해제하고 명령 대체를 사용하여 다른 변수를 내보내려고 합니다. 이것은 작동합니다:
$(echo "
export TEST_A=1
export TEST_B=2
")
이:
$(echo "
unset TEST_A
unset TEST_B
")
그러나 이는 Debian Jessie의 OSX 및 Bash 4.3.30(1) 릴리스 모두에서 실패합니다.
$(echo "
unset TEST_A
export TEST_B=1
")
# bash: unset: `TEST_B=1': not a valid identifier
이것이 예상되는 동작입니까? 명령 대체를 사용하여 여러 변수를 설정 해제하고 내보내는 방법은 무엇입니까?
몇 가지 맥락을 제공하려면 다음과 같습니다.boot2docker의 문제.
답변1
존재하다:
$(echo "
export TEST_A=1
export TEST_B=2
")
, $(...)
하나의 확장만 간단한 명령으로 구문 분석됩니다.
따라서 $(...)
확장은 분할+글로브 연산자를 거칩니다. 출력에는 echo
후행 줄 바꿈이 잘리고 IFS 문자(기본적으로 줄 바꿈, 공백 및 탭)의 단어로 분할됩니다.
export
TEST_A=1
export
TEST_B=2
각 단어는 와일드카드 문자를 통해 전달됩니다. 여기서는 와일드카드 문자가 포함되어 있지 않기 때문에 자체적으로 확장됩니다. 따라서 와일드카드를 사용한 후에도 여전히 동일한 4개의 문자열 목록이 있습니다.
실행할 명령은 첫 번째 명령에서 파생됩니다. 여기서 export
이러한 모든 문자열은 명령에 매개변수로 전달됩니다. 따라서 여기에는 다음과 같이 썼습니다.
export TEST_A=1 export TEST_B=2
따라서 TEST_A
값이 1인 변수, export
값이 변경되지 않는 변수, TEST_B
값이 2인 변수를 내보냅니다.
실행 중인 마지막 항목에서 다음을 수행합니다.
unset TEST_A export TEST_B=1
echo
출력을 쉘 코드로 해석 하려면 다음을 사용해야 합니다.eval
그리고사용하지 마세요분할+전역연산자(명령 대체 인용):
eval "$(echo "
unset TEST_A
export TEST_B=1
")"
그것도간단한 명령. 두 개의 문자열: eval
및 <newline><spaces>unset TEST_A<newline><spaces>export TEST_B=1
.
eval
쉘 코드에 대한 인수의 내용을 평가합니다. unset TEST_A
따라서 export TEST_B=1
다음 두 개의 셸 명령줄을 실행합니다.간단한 명령).