web-dev-qa-db-ja.com

update-alternativesを使用して代替を追加するより良い方法?

update-alternativesのマニュアルを何回か調べましたが、特定の代替案を指す現在のリンクを表示する方法がわかりません。その情報は、新しい代替案を追加するときに必要です。

update-alternativesマニュアルから:

--install <link> <name> <path> <priority>

Javaランタイムエディションの新しいバージョンを追加したいが、代替(<link>パラメータ)にリンクしている現在のシンボリックリンクがわからない。です:

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>

16
pagliuca

あなたの最初の質問に答えるために、私はあなたに示唆したいと思います --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がコマンドシンボリックリンクが何であるかを知る方法に興味があり、ソースを簡単に調べました。もちろん、Alternativesシステムは各グループの設定を保存する必要があり、administrative directoryと呼ばれ、manページに記述されていることがわかります;-)

この情報は/var/lib/dpkg/alternatives(デフォルト)にあります。これらの各ファイルの2行目は、探しているマスターリンクを定義しています。次のように抽出できます:

usr@srv $ sed -ne 2p /var/lib/dpkg/alternatives/Java
/usr/bin/Java

ただし、これはupdate-alternativesの古いバージョンを使用している場合の回避策にすぎません。

13
binfalse

ここでシンプトンの質問:<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の出力を使用するスクリプトを作成できます。

6
martshal