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


16

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

update-alternativesマニュアルから:

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

Java Runtime Editionの新しいバージョンを追加したいとしますが、代替(<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>

回答:


13

最初の質問に答えるために、次のことをお勧めします--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コマンドシンボリックリンクとは何かをどのように知っているのか興味があり、ソースを簡単に調べました。もちろん、代替システムは各グループの設定を保存する必要があり、管理ディレクトリと呼ばれ、manページに記述されていることがわかります;-)

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

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

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


回答いただきありがとうございますが、私が実行しているupdate-alternativesのバージョン(1.16.1.2)では、-queryまたは--displayのどちらも使用してリンク情報を表示しません。どのバージョンを使用していますか? sudo update-alternatives --query java Link: java Status: auto Best: /usr/local/java/jre1.6.0_45/bin/java Value: /usr/local/java/jre1.6.0_45/bin/java Alternative: /usr/local/java/jre1.6.0_45/bin/java Priority: 0
パグリウカ

私がしまし1.16.10インストールされています。バージョンを更新できませんか?
binfalse

あなたは男です!どちらのソリューションも優れています!
pagliuca

6

ここでのシンプトンの質問:これは、システムがコマンドラインでプログラムを呼び出すために使用するリンクであるため、<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


ヒントをありがとう、しかしそれが役に立たない時があります。私はupdate-alternativesまた、Firefoxのjavaおよびflashプラグインを追跡するために使用し、それらのプラグインを配置するパス「/ usr / lib / mozilla / plugins」を常に忘れています。whichまたは、whereisまたは私の頭に浮かぶコマンドを使用してそのパスを見つけることができませんが、@binfalseからの答えは、実行時にマシン上でそのパスを正しく返しますupdate-alternatives --query java-plugin
-pagliuca
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.