설명서를 여러 번 살펴봤지만 update-alternatives
특정 대안에 대한 현재 링크를 표시하는 방법을 찾을 수 없으며 새 대안을 추가할 때 해당 정보가 필요합니다.
update-alternatives
매뉴얼 에서 :
--install <link> <name> <path> <priority>
<link>
Java Runtime Edition의 새 버전을 추가하고 싶지만 대안( 매개변수) 에 대한 현재 심볼릭 링크를 모른다고 가정해 보겠습니다 . 내가 현재 하는 일은:
sudo update-alternatives --install /tmp/randomStuff java /usr/local/java/jre1.7.0_25/bin/java 0
이 명령은 다음을 출력합니다:
update-alternatives: renaming java link from /usr/local/bin/java to /tmp/randomStuff.
출력을 읽으면서 대안에 대한 이전 링크를 찾았으므로 마침내 올바른 매개변수를 사용 <link>
하여 명령을 다시 실행할 수 있었습니다 ./tmp/randomStuff
/usr/local/bin/java
sudo update-alternatives --install /usr/local/bin/java java /usr/local/java/jre1.7.0_25/bin/java 0
/tmp/randomStuff
이것은 훌륭하게 작동하지만 보시다시피 인수를 사용하여 명령을 실행하는 것은 <link>
매우 어색합니다.
따라서 질문이 생깁니다. (1) update-alternative
현재 링크를 특정 대안으로 출력하는 매개변수가 있습니까? 아니면 (2) 새 매개변수를 제공하지 않고 새 대안을 설치하고 단순히 현재 매개변수를 유지하는 방법이 있습니까 <link>
?
답변1
귀하의 첫 번째 질문에 답변하기 위해 귀하에게 묻고 싶습니다.--query
:
--query name
Display information about the link group like --display does, but in a machine parseable way (see section QUERY FORMAT below).
이를 통해 내 Java 예제와 같이 연결된 소스를 얻을 수 있습니다.
usr@srv % update-alternatives --query java
Name: java
Link: /usr/bin/java
[...]
보시다시피 제 체인은 이렇게 생겼습니다 /usr/bin/java -> /etc/alternatives/java -> ...
.
안타깝게도 두 번째 질문에는 답변을 드릴 수 없습니다. 한동안 해결책을 찾고 있었지만 아직 쉬운 해결책은 없는 것 같습니다. 당신이 할 수 있는 일은 --query
호출의 출력을 구문 분석하는 몇 가지 해킹을 작성하는 것입니다. 아마도 다음과 같습니다:
update-alternatives --query java | /bin/grep Link | cut -f 2 -d " "
--install
그런 다음 이를 호출에 대한 입력 으로 사용할 수 있습니다 . 하지만 이 방법은 다소 혼란스러울 수 있으므로 권장하지 않습니다. 대신에 다음을 살펴보는 것이 좋습니다.galternatives
, 교체 시스템의 프런트 엔드. 이런 기본적인 작업에 그래픽 도구를 사용하는 것을 좋아하지 않는데도 너무 편리해서 명령줄 도구 대신 이 도구를 사용하게 되었습니다.
편집하다
명령어 심볼릭링크가 무엇인지 궁금해서 update-alternatives
소스코드를 간략하게 살펴보았습니다. 물론 교체 시스템은 각 그룹의 구성을 저장해야 합니다.관리 디렉토리맨 페이지에 기록되어 있습니다 ;-)
이 정보는 기본적으로 표시됩니다 /var/lib/dpkg/alternatives
. 각 파일의 두 번째 줄은 다음을 정의합니다.메인 링크당신이 찾고있는 것. 다음과 같이 추출할 수 있습니다.
usr@srv $ sed -ne 2p /var/lib/dpkg/alternatives/java
/usr/bin/java
그러나 이는 이전 버전을 사용하는 사용자에게만 해당됩니다 update-alternatives
.
답변2
Simpleton 여기에 대한 질문: Simple 은 시스템이 명령줄을 통해 프로그램을 호출하는 데 사용하는 링크이기 때문에 <link>
항상 동일한 링크를 검색 하지 않습니까 ?which [program]
예를 들어, pycharm에 대한 링크를 추적하면 다음과 같은 결과를 얻습니다.
user@computer:~$ which pycharm
/usr/bin/pycharm
user@computer:~$ ll /usr/bin/pycharm
lrwxrwxrwx 1 root root 25 Mar 12 2015 /usr/bin/pycharm -> /etc/alternatives/pycharm*
user@computer:~$ ll /etc/alternatives/pycharm
lrwxrwxrwx 1 root root 43 Mar 12 2015 /etc/alternatives/pycharm -> /opt/pycharm-community-4.0.5/bin/pycharm.sh*
그런 다음 다음을 사용할 수 있습니다.
sudo update-alternatives --install /usr/bin/pycharm pycharm /opt/pycharm-community-4.5.0/bin/pycharm.sh 0
새로 설치된 pycharm의 경우.
그런 다음 which
.
답변3
--install을 사용하면 기존의 모든 대안을 다시 제공할 필요가 없습니다. 아래 예를 참조하세요.https://wiki.debian.org/DebianAlternatives. 여기서 x-terminal-emulator 대신 /usr/local/bin/alacrtty를 추가하고 선택합니다.
[schwarzgerat](0) $ sudo update-alternatives --install /usr/bin/x-terminal-emualtor x-terminal-emulator /usr/local/bin/alacritty 10
update-alternatives: renaming x-terminal-emulator link from /usr/bin/x-terminal-emulator to /usr/bin/x-terminal-emualtor
[schwarzgerat](0) $ sudo update-alternatives --config x-terminal-emulator
There are 16 choices for the alternative x-terminal-emulator (providing /usr/bin/x-terminal-emualtor).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/terminator 50 auto mode
1 /usr/bin/gnome-terminal.wrapper 40 manual mode
* 2 /usr/bin/kitty 20 manual mode
3 /usr/bin/koi8rxterm 20 manual mode
4 /usr/bin/konsole 40 manual mode
5 /usr/bin/lxterm 30 manual mode
6 /usr/bin/mlterm 20 manual mode
7 /usr/bin/pangoterm 15 manual mode
8 /usr/bin/st 15 manual mode
9 /usr/bin/terminator 50 manual mode
10 /usr/bin/terminology 40 manual mode
11 /usr/bin/terminus 20 manual mode
12 /usr/bin/urxvt 20 manual mode
13 /usr/bin/uxterm 20 manual mode
14 /usr/bin/xfce4-terminal.wrapper 40 manual mode
15 /usr/bin/xterm 20 manual mode
16 /usr/local/bin/alacritty 10 manual mode
Press <enter> to keep the current choice[*], or type selection number: 16
update-alternatives: using /usr/local/bin/alacritty to provide /usr/bin/x-terminal-emualtor (x-terminal-emulator) in manual mode
[schwarzgerat](0) $