메인 쉘에서 내보내지 않고 서브쉘에서 상속된 변수

메인 쉘에서 내보내지 않고 서브쉘에서 상속된 변수

다음 쉘 스크립트가 있습니다

var="this is a test"

ls -ltr| while read file
do
     echo $var
done
echo $var

다음과 같은 결과가 나타납니다.

this is a test
this is a test
this is a test

파이프가 새로운 하위 쉘을 생성하고 "var" 변수를 메인 쉘로 내보내지 않을 것이므로 while 루프 내에서 "var" 변수의 값을 "this is a test"로 설정하려면 어떻게 해야 합니까?

제가 아는 한, 하위 쉘이 상위 쉘에서 변수 값을 상속받으려면 변수를 내보내야 하는데 이 경우 "export" 문 없이 변수 값이 상속됩니다.

답변1

Bash 매뉴얼에 뭐라고 적혀 있는지 살펴보겠습니다(3.7.3 명령 실행 환경)

셸에는 다음 부분으로 구성된 실행 환경이 있습니다.

  • 변수 할당을 통해 설정된 쉘 매개변수환경의 쉘 부모로부터 설정되거나 상속됨
  • 실행 중에 정의되거나 환경의 쉘 부모로부터 상속된 쉘 함수

명령 대체, 괄호로 묶인 명령 및 비동기 명령은 다음과 같이 호출됩니다.서브쉘 환경은 쉘 환경의 복사본입니다.[...]

서브쉘 환경에 대한 변경은 쉘의 실행 환경에 영향을 주지 않습니다.

존재하다3.2.2 파이프라인,라고도 한다

파이프라인의 각 명령은 자체 하위 셸에서 실행됩니다.

(물론 이는 다중 명령 파이프라인에만 적용됩니다)

따라서 파이프라인의 다양한 부분과 기타 하위 셸은 다음의 복사본을 얻습니다.모두쉘 변수이지만 이에 대한 모든 변경 사항은아니요쉘에 표시됩니다.

다른 명령의 경우 여전히 필요합니다 export.

내장 함수나 쉘 함수가 아닌 단순 명령을 실행하고자 하는 경우에는 다음과 같이 구성된 별도의 실행 환경에서 호출된다.

  • 내보내기용으로 표시된 셸 변수 및 함수, 명령을 위해 내보낸 변수는 환경에 전달됩니다.

생각해 볼 만한 것: 이것은 무엇을 인쇄하는가?

bash -c 'f() { echo "$a $b"; }; a=1; b=1; (b=2; f); f'

관련 정보