Bash: 명령을 설정되지 않은/내보낸 여러 명령으로 대체

Bash: 명령을 설정되지 않은/내보낸 여러 명령으로 대체

일부 변수를 설정 해제하고 명령 대체를 사용하여 다른 변수를 내보내려고 합니다. 이것은 작동합니다:

$(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다음 두 개의 셸 명령줄을 실행합니다.간단한 명령).

관련 정보