셸에서 만든 변수는 기본적으로 그 셸 안에서만 보이고, 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 # 빠져나오면 원래 환경영구 설정
- 내 셸 세션 전체:
~/.bashrc,~/.zshrc에 적고source ~/.zshrc로 다시 읽는다(zsh·oh-my-zsh 터미널 환경) - 시스템 전체:
/etc/environment등. 다시 로그인해야 반영된다 - launchd·systemd가 띄우는 프로세스는 로그인 셸 설정을 읽지 않아 환경변수를 따로 줘야 한다(macOS launchd로 상주 프로세스 띄우기)
프론트엔드 빌드 도구의 env 파일도 결국 이 프로세스 환경을 읽는다(Vite mode와 env 파일). 비밀값을 환경변수로 넘길 때의 주의는 Docker Compose에서 다룬다.