노트

환경변수 스코프와 source

Environment Variable Scope and source

인프라#linux · 연결된 개념 7개

쉽게 말하면

환경변수 스코프는 집안의 물려주기 규칙 같아요. export한 변수는 자식 프로세스에게 물려주지만 자식이 바꾼 건 부모에게 돌아오지 않아서, 스크립트로 바꾼 환경이 내 셸에는 남지 않아요.

비유가 깨지는 곳 물려주지 않고 부모가 직접 하게 만드는 길도 있어요. source나 점 명령은 새 프로세스 없이 현재 셸에서 실행해 변수와 cd가 남고, launchd가 띄운 프로세스는 셸 설정을 아예 읽지 않아요.

셸에서 만든 변수는 기본적으로 그 셸 안에서만 보이고, export해야 그 셸이 띄우는 자식 프로세스(child process)에 전달된다. 그리고 스크립트를 실행하면 자식 프로세스에서 돌기 때문에, 스크립트가 바꾼 환경은 부모 셸로 돌아오지 않는다.

NAME=dev            # 현재 셸에서만
export NAME=dev     # 현재 셸 + 자식 프로세스

실행과 source의 차이

  • ./env.sh, bash env.sh: 새 프로세스에서 실행된다. 끝나면 그 안에서 설정한 변수는 사라진다
  • source env.sh, . env.sh: 현재 셸에서 그대로 실행된다. 변수·함수·cd가 현재 셸에 남는다
  • 그래서 가상환경 활성화(source .venv/bin/activate)나 환경변수 파일 로드는 source로 한다

격리된 셸을 일부러 띄우기

반대로 특정 작업용 변수가 평소 셸을 오염시키지 않게 하려면, 설정 파일을 읽은 새 셸로 들어간다.

bash --rcfile ./project.rc   # 이 셸 안에서만 변수 적용
exit                         # 빠져나오면 원래 환경

영구 설정

프론트엔드 빌드 도구의 env 파일도 결국 이 프로세스 환경을 읽는다(Vite mode와 env 파일). 비밀값을 환경변수로 넘길 때의 주의는 Docker Compose에서 다룬다.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 컨테이너 네트워킹

    컨테이너는 각자 격리된 네트워크를 가지므로, 서로 통신하려면 같은 도커 네트워크에 붙인다. 같은 사용자 정의 네트워크(user-defined network) 안에서는 도커 내장 DNS(Domain Name System)가 컨테이너 이름(또는 별칭)을 IP로 풀어 주어, IP 대신 이름으로 접속한다.

  • bash strict mode (set -euo pipefail)

    셸 스크립트 맨 위에 두는 set -euo pipefail은 실패를 조용히 넘기지 않게 하는 관용구다. 공식 기능 이름은 아니고, 흔히 "비공식 bash strict mode"라고 부른다.

  • hosts 파일

    도메인 이름과 IP 주소의 짝을 적어 두는 OS(Operating System)의 텍스트 파일. 이름을 해석할 때 DNS 서버보다 먼저 참조되므로, 특정 도메인을 내 컴퓨터나 다른 IP로 보내는 데 쓴다. macOS·Linux는 /etc/hosts, Windows는 C:\Windows\System32\drivers\etc\hosts다.

  • 빈 스코프

    빈 스코프(bean scope)는 스프링 컨테이너가 빈 인스턴스를 언제 만들고 얼마나 오래 유지하는지를 정한다. 기본값은 싱글턴이다.

  • 파이썬 스코프 (LEGB)

    파이썬은 이름을 찾을 때 Local → Enclosing → Global → Built-in 순서로 스코프를 뒤진다. 앞 글자를 따 LEGB(Local, Enclosing, Global, Built-in) 규칙이라 부른다. 함수 안에서 만든 변수는 그 함수 안에서만 살고, 바깥 함수의 변수는 안쪽 함수가 읽을 수 있다.

보기 옵션