연속적인 소스 사용 사이의 지속적인 환경 변수에 대한 이론적 근거

연속적인 소스 사용 사이의 지속적인 환경 변수에 대한 이론적 근거

문맥:

  • 운영 체제:오픈수세 도약 15.1
  • 핵심:리눅스 4.12.14-lp151.27-기본
  • 껍데기:GNU bash, 버전 4.4.23(1)-릴리스(x86_64-suse-linux-gnu)

다음 스크립트가 주어지면 test.sh라고 부르겠습니다.:

#!/bin/bash -e
echo "$TEST_VAR"

다른 실행에서는 다음을 반환합니다.

TEST_VAR=1234; source test.sh->산출:1234

source test.sh -> 산출:1234

질문:

  • 왜 env의 가치인가테스트 변수실행 사이에 지속됩니까( env | grep -i test_var)아무 것도 반환하지 않음)?
  • 이와 같은 것을 사용하는 대신 이를 방지할 수 있는 방법이 있습니까 exec bash?
  • 이전 질문에 대한 대답이 '예'라면 최소한 어느 정도 크로스쉘인 솔루션이 있습니까?

감사해요.

답변1

source(동의어.(가리키다)~ 할 것이다

현재 환경에서 명령 실행

즉, test.sh자체 변수가 있는 새 셸에서 실행되지 않고 단순히 현재 셸의 각 명령을 실행합니다. 특히 이렇게 하면 #!/bin/bash -e주석으로 처리되는 Shebang이 무효화됩니다. 스크립트를 다음으로 변경하려는 경우

set -e
echo "$TEST_VAR"
false

source반환 코드는 이므로 대화형 세션이 즉시 종료됩니다 false. 현재 셸의 출력을 어딘가에 저장하지 않으면 결과적으로 모든 오류 메시지가 손실됩니다(이것은 단지 에만 중요하지는 않지만 false실제 스크립트에는 중요합니다). 실패할 수 있는 스크립트를 실행하기 source위해 이 조합을 사용 하지 않는 것이 좋습니다 .set -e

TEST_VAR=1234; source test.sh단순히 명령을 분리하기 때문에 TEST_VAR값 은 유지됩니다 .;TEST_VAR=1234; source test.sh

TEST_VAR=1234
source test.sh

그것은 단지 과제 TEST_VAR와 통화일 뿐입니다 source. source현재 환경에서 명령이 실행되기 때문에 TEST_VAR해당 환경에서 사용할 수 있습니다.

;존재하지 않는 경우 TEST_VAR다음 명령 호출에 대해서만 할당을 유효하게 만들어 변경할 수 있습니다 source.

$ cat test.sh
#!/bin/bash -e
echo $TEST_VAR
$ TEST_VAR=1234 source test.sh
1234
$ source test.sh

env | grep -i test_var아무것도 반환하지도 않습니다

그 이유는 다음과 같이 설명됩니다.https://unix.stackexchange.com/a/268258/4699:

env는 외부 명령(셸 내장 명령과 반대)이므로 env는 셸에서 내보낸 변수만 인쇄합니다.

반대편 세트에는 모든 쉘 변수가 나열됩니다. 그들 중 일부는 수출됩니다.

내보내기는 쉘에서 내보낸 쉘 변수를 나열합니다.

export세트 변수를 내보내는 데에도 사용할 수 있습니다.

$ TEST_VAR=1234; source test.sh
1234
$ set | grep TEST
TEST_VAR=1234
$ env | grep TEST
$ export TEST_VAR
$ env | grep TEST
TEST_VAR=1234

답변2

스크립트에 사용되거나 source현재 .쉘 환경에서 실행됩니다.

이는 현재 쉘에서 사용 가능한 모든 쉘 변수가 도트 스크립트(가져오는 스크립트)에서도 사용 가능함을 의미합니다. 이는 또한 #!스크립트의 - 행이 완전히 무시된다는 것을 의미합니다.

표시하는 명령은 변수를 TEST_VAR값으로 설정합니다. 그런 다음 해당 쉘 변수에 액세스할 수 있는 도트 스크립트를 가져오고 가져온 이후 해당 값을 인쇄합니다.

그런 다음 동일한 도트 스크립트를 다시 얻습니다. unset마지막으로 스크립트를 가져온 이후 쉘 변수가 명시적으로 표시되지 않았으므로 값이 다시 인쇄됩니다 .

env당신은 +pipe에서 어떤 출력도 얻지 못합니다 grep.환경이 패턴과 일치하는 변수입니다. 이는 TEST_VAR결코 환경으로 내보내지지 않으며 엄밀히 말하면 쉘 변수이므로 하위 프로세스(예: env)에 의해 상속되지 않습니다.

스크립트를 일반 스크립트로 실행하면, 즉 를 사용하여 실행 가능하게 만든 chmod +x test.sh다음 실행하면 스크립트의 변수 값이 비어 있음 ./test.sh을 알 수 있습니다 . TEST_VAR이는 스크립트가 호출 셸의 셸 변수에 액세스할 수 없고 현재 환경에 호출 환경 변수가 없기 때문입니다( TEST_VAR+파이프라인에 호출 환경 변수가 없는 것처럼).envgrep

다음을 사용하여 기존 TEST_VAR셸 변수를 내보내면 값을 환경 변수로 스크립트에 가져올 수 있습니다.export TEST_VAR

TEST_VAR=$TEST_VAR ./test.sh

또는

env TEST_VAR="$TEST_VAR" ./test.sh

관련 정보