문맥:
- 운영 체제:오픈수세 도약 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
+파이프라인에 호출 환경 변수가 없는 것처럼).env
grep
다음을 사용하여 기존 TEST_VAR
셸 변수를 내보내면 값을 환경 변수로 스크립트에 가져올 수 있습니다.export TEST_VAR
TEST_VAR=$TEST_VAR ./test.sh
또는
env TEST_VAR="$TEST_VAR" ./test.sh