IT/shell

설치했고 PATH도 수정했는데... not found? 마지막 한 수는?

심량 2025. 6. 24. 14:04

 

심볼릭 링크도, alias도, PATH도 뭔가 부족했던 당신께.
진짜 실행 흐름을 장악하는 방법이 여기 있습니다.

Node, Java, Vim, Python 버전이 어지럽게 얽힌 환경 속에서,

/usr/bin/xxx

가 어디를 가리키는지 명확히 다루실 수 있으신가요?
그렇다면, 과감히 뒤로가기를 누르셔도 됩니다!

그렇지 않고 의도된 실행 흐름 설계를 원하신다면
update-alternatives가 그 무기가 됩니다.


⚔️ 그래서 뭐가 좋은데? 삼대장 비교

방식 적용 범위 반영 시점 자동 전환 적합한 상황
alias 셸 세션/사용자 수준 로그인 후 ❌ 없음 간단한 별칭, 임시 커맨드 변경
심볼릭 링크 수동 수정 시스템 전체 즉시 적용 ❌ 없음 단발성 대체, 경로 override용
update-alternatives 시스템 전체 + 정책 기반 선택 후 적용 ✅ 있음 다중 버전 관리에 최적

alias는 셸에 머무르고, symlink는 파일에 머무르며, alternatives는 시스템 실행 흐름을 다룹니다.


🧠 update-alternatives란?

Debian/Ubuntu 계열에 내장된 실행 경로 우선순위 관리 도구로:

  • /usr/bin/<이름> 같은 표준 경로에 어떤 바이너리를 연결할지 중앙 정책으로 결정합니다.
  • /etc/alternatives/를 경유하여 symlink를 정리하므로 관리가 체계적입니다.
  • 자동 선택, 수동 고정, 완전 제거 및 복원까지 하나로 처리 가능합니다.
  • --slave 옵션으로 관련 커맨드들을 한 그룹으로 통합 관리할 수도 있습니다.

📌 주요 명령 요약

sudo update-alternatives --install <공용링크> <이름> <실제경로> <우선순위>
sudo update-alternatives --config <이름>
sudo update-alternatives --set <이름> <경로>
sudo update-alternatives --auto <이름>
sudo update-alternatives --remove <이름> <경로>
sudo update-alternatives --display <이름>
sudo update-alternatives --get-selections
sudo update-alternatives --remove-all <이름>

⚙️ 우선순위와 모드 전환

🎚️ 우선순위

  • --install 시 부여하는 숫자가 클수록 우선순위가 높습니다.
  • 자동 모드(--auto)에서는 가장 우선순위가 높은 항목이 자동 선택됩니다.
  • 수동 모드로 지정하면 우선순위와 관계없이 명시된 항목만 사용됩니다.
sudo update-alternatives --set node /usr/local/bin/node  # 수동 지정
sudo update-alternatives --auto node                     # 자동 복귀

🔁 수동 ↔ 자동 전환

  • 수동 모드 지정: --set, 또는 --config에서 수동 선택
  • 자동 복귀: --auto <이름>
sudo update-alternatives --auto vim

🧾 현재 상태 확인 및 제거

sudo update-alternatives --display java
sudo update-alternatives --get-selections
sudo update-alternatives --remove-all python

🧪 실전 예시: 바이너리 통합 관리

✍️ Vim을 Neovim으로 교체

sudo update-alternatives --install /usr/bin/vim vim /usr/local/bin/nvim 100
sudo update-alternatives --config vim

🐍 Python 버전 지정

sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 20
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 40
sudo update-alternatives --config python

☕ Java 다중 버전 전환

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk/bin/java 1081
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk/bin/java 1111
sudo update-alternatives --config java

✨ 왜 alias보다 강력한가?

항목 alias alternatives
셸 세션 한정
시스템 전체 반영
자동 우선순위 적용
대화형 CLI 설정
연관 커맨드 그룹 묶음 (--slave)
자동화/스크립트 환경 연동 용이 🔸

alias는 마치 ‘서랍 속 메모’ 같고, alternatives는 ‘시스템의 기본 메뉴판’입니다.


🧨 마무리: 이젠 바이너리도 '정책'으로 다스리세요

CLI 커맨드가 어디를 가리키느냐에 따라, 시스템이 전혀 다르게 작동합니다.
PATH 순서만 바꾸는 수준에서 벗어나, 정책 기반 실행 통제를 경험해보세요.

/usr/bin/python → python2? python3?
/usr/bin/vim → vim.basic? nvim?

이제는 더 이상 우연이 아닌 당신의 의도가 결정하게 하십시오.

"alias는 즉흥입니다. update-alternatives는 설계입니다."

개발 환경 자동화부터 배포/이식/CI까지.
시스템의 주도권은 이제 당신의 손에 있습니다.🛠️🔥