Besseres Hinzufügen von Alternativen mit Update-Alternativen?

16

Ich habe update-alternativesmehrmals im Handbuch nachgeschlagen, aber ich kann nicht herausfinden, wie der aktuelle Link auf eine bestimmte Alternative verweist. Diese Informationen werden beim Hinzufügen einer neuen Alternative benötigt.

Aus dem update-alternativesHandbuch:

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

Angenommen, ich möchte eine neue Version von Java Runtime Edition hinzufügen, kenne aber den aktuellen Symlink, der auf die Alternative ( <link>Parameter) verweist, nicht . Was ich derzeit mache ist:

sudo update-alternatives --install /tmp/randomStuff java /usr/local/java/jre1.7.0_25/bin/java 0

Dieser Befehl gibt Folgendes aus:

update-alternatives: renaming java link from /usr/local/bin/java to /tmp/randomStuff.

Das Lesen die Ausgabe mir die alte Verbindung herauszufinden, die auf die Alternative deuten, so dass ich mein Kommando schließlich mit den rechten wieder laufen kann <link>Parameter, ändert /tmp/randomStuffan /usr/local/bin/java:

sudo update-alternatives --install /usr/local/bin/java java /usr/local/java/jre1.7.0_25/bin/java 0

Das funktioniert gut, aber wie Sie sehen, ist es sehr umständlich , den Befehl mit /tmp/randomStuffdem <link>Parameter auszuführen.

Hier kommen also die Fragen: (1) Gibt es update-alternativeArgumente, die den aktuellen Link ausgeben können, der auf eine bestimmte Alternative verweist, oder (2) gibt es eine Möglichkeit, eine neue Alternative zu installieren, ohne einfach einen neuen Parameter angeben zu müssen den Strom halten <link>?

Pagliuca
quelle

Antworten:

13

Um Ihre erste Frage zu beantworten, möchte ich Sie auf Folgendes hinweisen --query:

   --query name
          Display information about the link group like --display does, but in a machine parseable way (see section QUERY FORMAT below).

Mit dieser Option erhalten Sie die Linkquelle, z. B. in meinem Fall für Java:

usr@srv % update-alternatives --query java
Name: java
Link: /usr/bin/java
[...]

Du siehst also, wie meine Kette läuft /usr/bin/java -> /etc/alternatives/java -> ....

Leider habe ich keine Antwort auf Ihre zweite Frage. Ich habe vor einiger Zeit nach einer Lösung dafür gesucht, aber es scheint, dass es noch keine einfache Lösung gibt. Sie könnten einen Hack schreiben, um die Ausgabe des --queryAnrufs zu analysieren , vielleicht so:

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

die du dann als eingabe für den --installaufruf verwenden könntest . Aber da dies meiner Meinung nach ziemlich chaotisch ist, kann ich es nicht empfehlen. Stattdessen möchten Sie vielleicht einen Blick auf das galternativesFront-End des alternativen Systems werfen . Auch wenn ich nicht gerne grafische Elemente für solche grundlegenden Aufgaben verwende, ist dies recht praktisch und ich habe dieses Tool anstelle der Befehlszeilen-Tools verwendet.

BEARBEITEN

Ich war neugierig, wie ich update-alternativesweiß, was der Befehl symlink ist, und habe einen kurzen Blick in die Quellen geworfen. Natürlich muss das Alternativsystem die Konfiguration für jede Gruppe speichern und es stellt sich heraus, dass es sich um ein administratives Verzeichnis handelt und auf der Manpage geschrieben ist ;-)

Sie finden diese Informationen in /var/lib/dpkg/alternatives(standardmäßig). Die zweite Zeile in jeder dieser Dateien definiert den Master-Link, nach dem Sie suchen. Sie können es wie folgt extrahieren:

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

Dies ist jedoch nur eine Problemumgehung für Benutzer mit einer älteren Version von update-alternatives.

binfalse
quelle
Vielen Dank für Ihre Antwort, aber die Version von Update-Alternativen, die ich verwende (1.16.1.2), zeigt keine Link-Informationen an, die weder --query noch --display verwenden. Welche Version benutzt du? 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
Pagliuca
Ich habe 1.16.10installiert. Können Sie Ihre Version nicht aktualisieren?
Binfalse
Du bist der Mann! Beide Lösungen sind hervorragend!
Pagliuca
5

Einfache Frage hier: Wird es nicht <link>immer dieselbe sein, die von einem einfachen which [program]System abgerufen wird, da dies der Link ist, über den das System ein Programm über die Befehlszeile aufruft?

Wenn ich zum Beispiel die Links für pycharm zurückverfolge, die ich bekomme:

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*

Und ich kann dann verwenden:

sudo update-alternatives --install /usr/bin/pycharm pycharm /opt/pycharm-community-4.5.0/bin/pycharm.sh 0

Für meinen neuen Pycharm installieren.

Dann könnten Sie vielleicht ein Skript erstellen, um die Ausgabe von zu verwenden which.

Martshal
quelle
Danke für den Tipp, aber es gibt Zeiten, in denen das nicht hilfreich sein wird. Ich update-alternativesverfolge auch Java- und Flash-Plugins für Firefox und vergesse immer den Pfad "/ usr / lib / mozilla / plugins", in dem ich diese Plugins ablegen sollte. Ich kann diesen Pfad nicht mit whichoder whereisoder einem Befehl herausfinden, der mir in den Sinn kommt, wohingegen die Antwort von @binfalse diesen Pfad auf meinem Computer korrekt zurückgibt, wenn ich ihn ausführe update-alternatives --query java-plugin.
Pagliuca