C.W.K.
Stream
Lesson 03 of 10 · published

Login vs Non-Login, 인터랙티브 vs 비인터랙티브

~10 min · login-shell, interactive, non-interactive

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

직교하는 두 축

모든 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 만).

여기서 사람들이 미끄러져

~/.zshrcexport OPENAI_API_KEY=... 추가하면 터미널에선 동작. cron 이 스크립트 잡으면 변수가 비어 있어. cron 의 shell 은 non-login + 비인터랙티브라 .zshrc 건너뜀. 그 줄을 .zshenv 로 옮기거나, 스크립트가 명시적으로 파일 source.

런타임 확인

[[ -o login ]] && echo login. [[ -o interactive ]] && echo interactive. 플래그를 shell 안에서 introspect 가능.

Code

지금 어떤 shell 인지 감지·zsh
[[ -o login ]]       && echo 'login'       || echo 'non-login'
[[ -o interactive ]] && echo 'interactive' || echo 'non-interactive'

External links

Exercise

인터랙티브 zsh 에서 [[ -o interactive ]] && echo yes. 이어서 zsh -c '[[ -o interactive ]] && echo yes || echo no' — 안쪽 shell 은 비인터랙티브. bash -l -c 'echo $0' 으로 login bash 모양 보기.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.