바이너리를 쉘 명령어로 등록하기 (+ 버전 관리, 멀티 패키지)
PATH
- shell에 명령어를 입력하게 되면 환경 변수
PATH
에 등록된 경로를 차례로 뒤져가면서 해당 명령어와 일치하는 바이너리가 있는지 찾는다. /usr/bin
에 위치한 바이너리가 쉘에서 별도의 prefix 없이 명령어로서 사용할 수 있는 것은, 이 경로는 기본으로PATH
에 등록되어 있기 때문
패키지를 수동 설치 하거나 바이너리를 직접 가져온 경우, 이를 명령어로 등록하고 싶다면?
- 해당 바이너리가 위치한 경로를 환경변수
PATH
에 추가하는 방법 - PATH 관리가 좀 지저분해질 수 있다.
- 해당 바이너리만
/usr/bin
으로 직접 symbolic link하는 방법 - 가능은 하지만 단점이 있음. 버전이 여러 개인 경우.
- 예를 들면 java8, java12나 python2, python3 처럼 버전이 여러 개라면 관리가 난감할 수 있다.
- 버전 관리 도구를 사용하는 방법.
- 추천
이런 경우 버전 관리가 가능한 별도 도구를 사용하는 것이 좋다.
- 자바의 경우
jenv
를 사용할 수 있다.- 하지만 update-alternatives를 쓰는게 더 나아보인다.
- 파이썬은
pyenv
를 사용할 수 있다. - 특정 프로젝트에 패키지를 아예 가두려면
virtualenv
를 쓰는게 좋고.
linux : update-alternatives
- https://blog.benelog.net/installing-jdk.html#update_alternatives_alternatives
1 2
update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.8.0_171/bin/java" 1; update-alternatives --set java /usr/local/java/jdk1.7.0_45/bin/java;
1
2
3
4
5
6
7
root@ubuntu:/usr/bin# update-alternatives --config java
There is 1 choice for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/local/java/jdk1.8.0_171/bin/java 1 auto mode
* 1 /usr/local/java/jdk1.8.0_171/bin/java 1 manual mode
Press <enter> to keep the current choice[*], or type selection number:
/usr/bin/java -> /etc/alternatives/java
로 심볼릭 링크를 생성해준다.
macOS : /usr/libexec/java_home
1
2
3
4
5
6
7
8
9
❯ /usr/libexec/java_home -V
Matching Java Virtual Machines (3):
19.0.2 (arm64) "Amazon.com Inc." - "Amazon Corretto 19" /Users/user/Library/Java/JavaVirtualMachines/corretto-19.0.2/Contents/Home
17.0.8 (arm64) "Azul Systems, Inc." - "Zulu 17.44.15" /Users/user/Library/Java/JavaVirtualMachines/azul-17.0.8/Contents/Home
1.8.0_382 (arm64) "Azul Systems, Inc." - "Zulu 8.72.0.17" /Users/user/Library/Java/JavaVirtualMachines/azul-1.8.0_382/Contents/Home
/Users/user/Library/Java/JavaVirtualMachines/corretto-19.0.2/Contents/Home
---
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
bash 환경변수 명시 스크립트 불러오는 순서
각 스크립트를 열어보면 if 있으면 then 그 스크립트를 실행한다
내용이 상단에 적혀있어서, .bash_profile이 .bashrc를 부르고, .bashrc가 /etc/bashrc를 부르고.. 이런 식이다.
/etc/profile.d/
/etc/bashrc
.bashrc
— non-login shell에도 적용하려면 여기, 또는 상위 스크립트에 명시해야 한다..bash_profile
This post is licensed under CC BY 4.0 by the author.