함수 내부에서 변수를 내보내는 것이 해당 변수의 전역 내보내기와 동일합니까?

함수 내부에서 변수를 내보내는 것이 해당 변수의 전역 내보내기와 동일합니까?

저는 기본 Bash와 함께 Ubuntu 16.04를 사용하고 있습니다.

실행 여부는 잘 모르겠습니다.

#!/bin/bash
myFunc() {
    export myVar="myVal"
}
myFunc

모든 의미에서 실행과 동일합니다 export myVar="myVal".

물론, 전역 변수는 일반적으로 함수 외부에서 선언되어야 합니다(기술적으로 가능하더라도 관례의 문제라고 생각합니다). 그러나 사람들이 매우 일반적인 함수를 작성하고 변수를 사용하려는 좀 더 이국적인 경우가 궁금합니다. 그 안에는 여전히 어디서나 무엇이든 사용할 수 있습니다.

export함수 내부의 변수는 CLI에서 전역으로 직접 내보내어 셸의 모든 항목(그 안에 있는 모든 하위 셸 및 함수)에서 사용할 수 있도록 하는 것과 동일합니까?

답변1

myVar스크립트는 스크립트 환경에 환경 변수를 생성합니다. 현재 제공되는 스크립트는 기능적으로 다음과 동일합니다.

#!/bin/bash

export myVar="myVal"

함수 본문에서 발생한다는 사실은 export환경 변수의 범위(이 경우)와는 아무 관련이 없습니다. 함수가 호출되면 존재하기 시작합니다.

변수는 스크립트 환경과 함수 호출 후 스크립트에서 시작된 다른 프로세스의 환경에서 사용할 수 있습니다.

이 변수는 스크립트가 시작되지 않는 한( .또는 을 사용하여 source) 상위 프로세스(스크립트를 실행하는 대화형 셸) 환경에 존재하지 않습니다. 이 경우 전체 스크립트는 대화형 셸 환경(예: "source")에 존재합니다. 쉘 파일).

함수 호출 자체는 없습니다.

myFunc() {
    export myVar="myVal"
}

구입이것myFunc파일은 호출 쉘의 환경에 배치됩니다 . 그런 다음 이 함수를 호출하면 환경 변수가 생성됩니다.

질문도 참조하세요쉘 변수는 어떤 범위를 가질 수 있습니까?

답변2

변수를 내보내는 함수를 사용하는 경우 서브셸에서 호출하지 않도록 주의하세요.

( export_var_func )  # Variable will NOT be exported outside

파이프가 서브쉘을 사용하기 때문에 함수가 파이프된 경우에도 이런 일이 발생합니다.

예를 들어 T자형으로 들어가는 파이프는 다음과 같습니다.

export_var_func | tee my.log # Variable will NOT be exported outside

서브셸 파이핑을 방지하려면 대신 리디렉션을 사용하세요.

export_var_func > >(tee func.log) # Variable WILL be exported outside

관련 정보