Post

바이너리를 쉘 명령어로 등록하기 (+ 버전 관리, 멀티 패키지)

PATH
  • shell에 명령어를 입력하게 되면 환경 변수 PATH에 등록된 경로를 차례로 뒤져가면서 해당 명령어와 일치하는 바이너리가 있는지 찾는다.
  • /usr/bin에 위치한 바이너리가 쉘에서 별도의 prefix 없이 명령어로서 사용할 수 있는 것은, 이 경로는 기본으로 PATH에 등록되어 있기 때문
패키지를 수동 설치 하거나 바이너리를 직접 가져온 경우, 이를 명령어로 등록하고 싶다면?
  • 해당 바이너리가 위치한 경로를 환경변수 PATH에 추가하는 방법
  • PATH 관리가 좀 지저분해질 수 있다.
  • 해당 바이너리만 /usr/bin으로 직접 symbolic link하는 방법
  • 가능은 하지만 단점이 있음. 버전이 여러 개인 경우.
  • 예를 들면 java8, java12나 python2, python3 처럼 버전이 여러 개라면 관리가 난감할 수 있다.
  • 버전 관리 도구를 사용하는 방법.
    • 추천
이런 경우 버전 관리가 가능한 별도 도구를 사용하는 것이 좋다.
  • 자바의 경우 jenv를 사용할 수 있다.
    • 하지만 update-alternatives를 쓰는게 더 나아보인다.
  • 파이썬은 pyenv를 사용할 수 있다.
  • 특정 프로젝트에 패키지를 아예 가두려면 virtualenv를 쓰는게 좋고.
  • 둘 다 못쓰는 일반 바이너리라면 리눅스에서 제공하는 update-alternatives 를 사용하면 된다.
  • https://blog.benelog.net/installing-jdk.html#update_alternatives_alternatives
1
2
3
4
5
6
7
8
9
10
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;
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로 심볼릭 링크를 생성해준다.

java는 그냥 /usr/libexec/java_home 쓰면 된다

1
2
3
4
5
6
7
8
9
10
❯ /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.