bash: FOO_VARIABLE=foo;./test foo 변수가 테스트에 전달되지 않았습니다. 왜 상속되지 않습니까?

bash: FOO_VARIABLE=foo;./test foo 변수가 테스트에 전달되지 않았습니다. 왜 상속되지 않습니까?

나는 웹 검색을 했고 다음을 포함하여 bash에서 변수를 사용하는 것에 관한 여러 기사를 읽었습니다.위키피디아FOO_VARIABLE=foo;./test그러나 Bash에서 실행해도 테스트 결과가 다음과 같은 결과를 얻지 못하는 $FOO_VARIABLE이유 를 이해할 수 없습니다 foo.

기본적으로 프로세스가 생성되면 하위 프로세스를 생성할 때 상위 프로세스에서 수행한 명시적인 변경 사항을 제외하고는 상위 프로세스의 반복 환경을 상속합니다.

또한 읽으십시오:환경 변수 상속의 예외

"명시적인 변경 사항 외에": FOO_VARIABLE=foo ./test- test스크립트가 알 수 있게 FOO_VARIABLE하지만, 첫 번째 방법에서는 왜 알 수 없습니까?

echo $0
-bash

cat ./test
echo $MY_TEST
MY_TEST=test$MY_TEST
echo $MY_TEST

MY_TEST=ret;./test

test

CentOS 7 및 Mac 운영 체제에서 테스트되었습니다.

다음에 추가: https://stackoverflow.com/questions/9772036/pass-all-variables-from-one-shell-script-to-another 두 번째 방법은 소스 코드를 얻는 것입니다(첫 번째 스크립트에서 두 번째 스크립트 호출). 그러면 그럴 필요가 없습니다 export. 제 경우는 왜 다른가요?

위에서 편집됨: 이것은 제가 서두르고 세부 사항에 많은 주의를 기울이지 않는 것입니다. .이제 읽었으므로 소싱 부분에서 한 가지 (포인트)를 놓쳤습니다.https://superuser.com/questions/176783/what-is-the-difference-Between-executing-a-bash-script-vs-commerce-it이 부분은 모두 명확합니다.

https://askubuntu.com/questions/26318/environment-variable-vs-shell-variable-whats-the-difference 예, 내 것은 로컬이지만 상속(포크 호출)을 통해 전달되지 않는 이유는 무엇입니까?

답변1

첫 번째 명령에서는

FOO_VARIABLE=foo;./test

FOO_VARIABLE쉘 변수에 값을 할당합니다 . 그런 다음 전화를 겁니다 ./test. 내보내지지 않으므로 FOO_VARIABLE환경 변수가 아니므로 실행하는 스크립트나 프로그램에서 상속되지 않습니다. 그렇기 때문에 ./test변수를 알 수 없습니다.

간단히 말해서, "여기"에 쉘 변수를 설정했지만 "거기"(in)에서는 사용할 수 없습니다 ./test.

다른 명령에서는

FOO_VARIABLE=foo ./test

FOO_VARIABLE환경에 설정한 값(즉, ./test이름이 환경 변수 생성)입니다. 이 변수는 현재 환경에서 환경 변수나 쉘 변수로 설정되지 않으며, 실행에 의해 생성된 프로세스에만 적용 가능합니다../testFOO_VARIABLE./test

즉, 환경 변수를 " ./test여기"가 아닌 "거기"(in)로 설정합니다.

FOO_VARIABLE스크립트나 프로그램이 기존 변수를 환경 변수로 상속하도록 하려면 이를 사용해야 합니다 export. 즉, 여기에서 환경 변수를 생성해야 합니다.

FOO_VARIABLE=foo
export FOO_VARIABLE
./test

아니면 더 짧게

export FOO_VARIABLE=foo
./test

./test이렇게 하면 변수가 로컬로 설정되고 생성된 모든 프로세스( 예:) 에서 사용할 수 있습니다 .

답변2

왜냐하면 이때는 환경변수가 아니고 쉘/로컬 변수이기 때문입니다. export MY_TEST작동하려면 필요합니다 . 또 다른 옵션은 다음과 같습니다.

env MY_TEST=ret ./test

(간단히 Bash에서도 가능 MY_TEST=ret ./test하지만그리고 env쉘 전반에 걸쳐 더 많은 이식성을 제공합니다. )

그런데, 당신은 또한 당신의 ./test것을 env|grep MY_TEST.

Bash에서는 (다른 모든 쉘은 아님) 다음과 같이 말할 수도 있습니다.

이 경우 쉘 프롬프트에서 실행하는 것은 스크립트에서 실행하는 것과 동일합니다.

사용:

export MY_TEST=ret; env|grep MY_TEST

내가 쓴 내용을 확인하기 위해.

./test동일한 쉘 방언을 사용하는 쉘 스크립트를 가정하면 다음을 사용할 수도 있습니다.

source ./test

...모든 명령문을 ./test현재 쉘에 넣습니다. 실제로 다른 프로세스를 시작하지 않기 때문에 쉘/로컬 변수도 표시됩니다.

서브셸에는 자체 설정(예: 셸 옵션 및 작업 디렉터리)이 있지만 기술적으로는 동일한 프로세스에서 실행됩니다. 그래서 fork()참여가 없습니다. fork()명령줄 인수 가 있는 경우환경 변수콘텐츠를 다른 스크립트/실행 파일에 전달하는 방법입니다.


이는 하위 쉘이 상위 쉘의 쉘/로컬 변수를 상속하는 경우와 다릅니다.

TEST=ret; (echo "shell variable=$TEST"; env|grep TEST)

다음은 서브쉘입니다(내부 (...)).~ 할 것이다변수를 살펴보지만 여전히 환경 변수가 아닙니다.

관련 정보