나는 웹 검색을 했고 다음을 포함하여 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
이름이 환경 변수 생성)입니다. 이 변수는 현재 환경에서 환경 변수나 쉘 변수로 설정되지 않으며, 실행에 의해 생성된 프로세스에만 적용 가능합니다../test
FOO_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)
다음은 서브쉘입니다(내부 (...)
).~ 할 것이다변수를 살펴보지만 여전히 환경 변수가 아닙니다.