다른 셸에서 환경 변수를 변경하면 다른 셸에서도 변경되나요, 아니면 그대로 유지되나요?

다른 셸에서 환경 변수를 변경하면 다른 셸에서도 변경되나요, 아니면 그대로 유지되나요?

Bash에서 환경 변수를 생성하는 경우 SPORT=baseball이라고 말한 다음 tcsh로 전환하여 "running"으로 변경합니다. bash로 다시 변경하면 SPORT가 "실행 중"으로 표시됩니까? (직접 시도해보고 싶지만 bash만 있습니다)

답변1

다음은 귀하가 요청한 작업을 정확하게 수행하고, bash환경 변수를 설정한 다음, tcsh해당 값을 시작하고 변경하는 실제 실험입니다. 그런 다음 의 값을 확인합니다 bash.

#!/bin/bash

export SPORT=baseball
printf 'SPORT is "%s"\n' "$SPORT"

tcsh -c 'echo $SPORT; setenv SPORT archery; echo $SPORT'

printf 'SPORT is "%s"\n' "$SPORT"

bash스크립트를 실행하면 호출 tcsh결과는 다음과 같습니다.

SPORT is "baseball"
baseball
archery
SPORT is "baseball"

tcsh하지만 이것이 실제로 작동하는 것을 보기 위해 전환할 필요조차 없습니다. (...)스크립트 bash에 별도의 환경이 있는 하위 쉘을 도입하는 것으로 충분합니다 .

#!/bin/bash

export SPORT=baseball
printf 'SPORT is "%s"\n' "$SPORT"

(
    echo "$SPORT"
    export SPORT=archery
    echo "$SPORT"
)

printf 'SPORT is "%s"\n' "$SPORT"

출력은 변경되지 않습니다.

한 환경은 다른 환경에 영향을 미칠 수 없습니다.하지만 한 가지 예외가 있어요: 새 환경은 상위 환경의 환경 변수를 상속합니다. 이전 예제와 같은 하위 쉘도 내보내지 않은 쉘 변수를 상속합니다.

답변2

환경변수가 아닌데 그게 뭔가요?방법. "환경"은 프로세스에 따라 다릅니다. 다양한 상황에 따라 이 프로세스에서 분기된 다른 프로세스에 의해 상속될 수도 있고 상속되지 않을 수도 있습니다. 실행 중인 프로세스의 환경을 수정해도 다른 실행 중인 프로세스에는 영향을 주지 않습니다. *

환경 변수의 의미 이해POSIX 사양. (그리고 이 문서의 목적은 다음과 같습니다.구현자, 사용자를 타겟팅하는 것이 아니라 )

*또는 적어도 이에 대한 예외를 설계하려면 매우 뛰어난 저수준 코딩 기술이 필요합니다. C에서 이것이 가능한지는 모르겠습니다. 아마도 공유 메모리를 사용하는 것일 수도 있습니다. 그러나 명시적으로 그렇게 설계되지 않으면 그런 일이 발생하지 않습니다.

관련 정보