노트

환경변수 스코프와 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에서 다룬다.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • Nx

    Nx는 캐싱과 병렬 실행에 더해 프로젝트 그래프, 코드 생성, 아키텍처 규칙 강제까지 제공하는 모노레포 플랫폼이다. "빠른 실행 한 가지"에 집중하는 turborepo와 달리 기능을 두루 갖춘 쪽을 지향한다.

  • 컨테이너 네트워킹

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

  • bash strict mode (set -euo pipefail)

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

  • 빈 스코프

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

  • 운영 Node 프로세스의 메모리 누수 찾기

    살아 있는 Node 서버에 inspector를 붙이고, 힙 스냅샷 두 장을 비교해 무엇이 쌓이는지, retainer로 누가 붙잡고 있는지 찾는 절차.

보기 옵션