저는 기본 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