업데이트 대안을 사용하여 대안을 추가하는 더 좋은 방법은 무엇입니까?

업데이트 대안을 사용하여 대안을 추가하는 더 좋은 방법은 무엇입니까?

설명서를 여러 번 살펴봤지만 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) $

관련 정보