직교하는 두 축
모든 shell 은 두 flag 를 가져:
- Login 인가 — login shell = 세션 첫 shell. Terminal.app, ssh,
su -. - Interactive 인가 — 인터랙티브는 프롬프트. 비인터랙티브는 스크립트.
2 × 2 = 네 종류 shell, 각자 다른 설정 파일 세트.
매트릭스 (zsh)
| 인터랙티브 | 비인터랙티브 | |
|---|---|---|
| Login | .zshenv → .zprofile → .zshrc → .zlogin | .zshenv → .zprofile → .zlogin |
| Non-login | .zshenv → .zshrc | .zshenv only |
실제 케이스
- Terminal.app 열기 → login + 인터랙티브 (full reload).
ssh user@host→ login + 인터랙티브.ssh user@host 'echo hi'→ login + 비인터랙티브.- 세션에서
./script.sh실행 → non-login + 비인터랙티브. - zsh 안에서
zsh타이핑 → non-login + 인터랙티브. - cron / launchd 잡 → non-login + 비인터랙티브 (
.zshenv만).
여기서 사람들이 미끄러져
~/.zshrc 에 export OPENAI_API_KEY=... 추가하면 터미널에선 동작. cron 이 스크립트 잡으면 변수가 비어 있어. cron 의 shell 은 non-login + 비인터랙티브라 .zshrc 건너뜀. 그 줄을 .zshenv 로 옮기거나, 스크립트가 명시적으로 파일 source.
런타임 확인
[[ -o login ]] && echo login. [[ -o interactive ]] && echo interactive. 플래그를 shell 안에서 introspect 가능.