모든 프로그램이 읽는 상태
환경 변수는 프로세스가 이름으로 읽는 키-값 데이터야. $HOME, $PATH, $USER와 $LANG 같은 값이 프로그램의 동작을 바꿔. printenv는 현재 환경을 나열하고, printenv VAR는 특정 변수 하나를 보여 줘.
값을 설정하고 자식에게 전달하거나 지우기
VAR=value는 현재 셸의 변수만 설정해.export VAR=value는 이후에 시작하는 자식 프로세스에도 값을 전달해.unset VAR는 현재 셸에서 변수를 지워.VAR=value cmd는 해당 명령을 실행하는 동안에만 값을 전달해.HTTPS_PROXY=... curl ...가 대표적인 예야.
왜 export가 중요한가
export하지 않은 셸 변수는 자식 프로세스의 환경에 들어가지 않아. 따라서 python script.py로 실행한 프로그램이 os.environ['VAR']를 읽어야 한다면 먼저 그 변수를 내보내야 해.
자주 다루게 될 변수들
$PATH는 셸이 실행 파일을 찾을 디렉터리 순서를 정해.$HOME은 현재 사용자의 홈 디렉터리를 가리켜.$EDITOR는git commit처럼 편집기가 필요한 명령이 실행할 프로그램을 정해. 터미널 편집기는nvim처럼, GUI 편집기는 명령이 종료를 기다리도록code -w나cursor -w처럼 설정해.$PAGER는man같은 명령이 긴 출력을 보여 줄 프로그램을 정해.less -R처럼 설정할 수 있어.$LANG과$LC_*는 로케일과 문자 집합 규칙을 정해.$TERM은 터미널 기능의 종류를 알려 줘.
어디서 설정?
대화형 셸 설정은 보통 ~/.zshrc에 두고, 로그인할 때 필요한 환경 설정은 ~/.zprofile에 둬. 두 파일이 읽히는 정확한 순서는 다음 레슨에서 다뤄.
환경 변수는 자식에게 내려가는 복사본이야
프로세스가 export한 값은 이후에 만든 자식이 받지만 이미 실행 중인 부모나 형제에게 거꾸로 전파되지 않아. 새 터미널과 오래 떠 있던 앱의 값이 다른 이유를 이 방향성에서 찾아.
비밀을 넣는 통로와 저장하는 곳을 구분해
환경 변수는 프로세스 목록, 크래시 리포트, 디버그 로그, 자식 프로세스로 새어 나갈 수 있어. 토큰을 닷파일에 평문으로 박지 말고 자격 증명 저장소에서 실행 시점에 최소 범위로 주입해. 편리한 전달 방식이 곧 안전한 저장소는 아니야.