更新の代替手段を使用して代替を追加するより良い方法は何ですか?

更新の代替手段を使用して代替を追加するより良い方法は何ですか?

ドキュメントを何度も見ましたが、特定の選択肢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 -> ...

残念ながら、2番目の質問には回答できません。しばらく解決策を探していましたが、まだ簡単な解決策はないようです。あなたができることは、--query呼び出しの出力を解析するいくつかのハッキングを書くことです。おそらく:

update-alternatives --query java | /bin/grep Link | cut -f 2 -d " "

--installその後、それを呼び出しへの入力として使用できます。ただし、この方法は多少混乱する可能性があるため、お勧めできません。代わりに、以下を見てください。galternatives、交換システムのフロントエンド。このような基本的な作業にグラフィックツールを使うのが好きではないのにとても便利なので、コマンドラインツールの代わりにこのツールを使うようになりました。

編集する

コマンドシンボリックリンクとは何か疑問に思ったので、update-alternativesソースコードを簡単に見ました。もちろん、交換システムは各グループの構成を保存する必要があります。管理ディレクトリマンページに記録されています;-)

この情報はデフォルトで表示されます/var/lib/dpkg/alternatives。各ファイルの 2 行目は次を定義します。メインリンクあなたが探しているもの。次のように抽出できます。

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) $

関連情報