Кращий спосіб додати альтернативу, використовуючи альтернативи оновлення?


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 -> ....

На жаль, у мене немає відповіді на ваше друге запитання. Я шукав рішення для цього деякий час тому, але, здається, ще немає простого рішення. Що ви можете зробити, це написати якийсь хак, щоб проаналізувати вихід --queryдзвінка, можливо так:

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

який ви потім можете використовувати як вхід для --installдзвінка. Але оскільки на мою думку це досить безладно, я не рекомендую цього. Замість цього, можливо, ви хочете ознайомитись galternativesіз передовою системою альтернатив. Навіть якщо я не люблю використовувати графічні речі для таких основних завдань, це досить зручно, і я в кінцевому підсумку використовував цей інструмент замість інструментів командного рядка.

EDIT

Мені було цікаво, як update-alternativesзнає, яка команда symlink, і коротко ознайомився з джерелами. Звичайно, система альтернатив повинна зберігати конфігурацію для кожної групи, і виявляється, що вона називається адміністративний каталог і написана на сторінці man ;-)

Ви знайдете цю інформацію в /var/lib/dpkg/alternatives(за замовчуванням). Другий рядок у кожному з цих файлів визначає головне посилання, яке ви шукаєте. Ви можете витягнути його так:

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

Однак це лише обхідне рішення для тих, хто має старішу версію 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
pagliuca

Я 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для відстеження java та flash плагінів для firefox, і я завжди забуваю шлях "/ usr / lib / mozilla / plugins", куди я повинен розміщувати ці плагіни. Я не можу знайти цей шлях за допомогою whichабо whereisбудь-якої команди, яка мені спадає на думку, тоді як відповідь від @binfalse правильно повертає цей шлях на моїй машині, коли я бігаю update-alternatives --query java-plugin.
pagliuca
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.