Лучший способ добавить альтернативу, используя update-альтернативы?

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интерфейс альтернативной системы. Даже если я не люблю использовать графические элементы для таких базовых заданий, это довольно удобно, и в итоге я использовал этот инструмент вместо инструментов командной строки.

РЕДАКТИРОВАТЬ

Мне было любопытно, как узнать, update-alternativesчто такое команда symlink, и я кратко изучил источники. Конечно, система альтернатив должна хранить конфигурацию для каждой группы, и оказывается, что она называется административным каталогом и записана на странице руководства ;-)

Вы найдете эту информацию в /var/lib/dpkg/alternatives(по умолчанию). Вторая строка в каждом из этих файлов определяет основную ссылку, которую вы ищете. Вы можете извлечь это так:

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

Тем не менее, это просто обходной путь для тех, кто имеет более старую версию update-alternatives.

binfalse
источник
Спасибо, что ответили, но версия альтернатив обновления, которую я использую (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.

martshal
источник
Спасибо за совет, но бывают случаи, когда это не поможет. Я также использую, update-alternativesчтобы отслеживать плагины java и flash для firefox, и я всегда забываю путь "/ usr / lib / mozilla / plugins", куда я должен поместить эти плагины. Я не могу найти этот путь, используя whichили whereisили любую команду, которая приходит мне в голову, в то время как ответ @binfalse правильно возвращает этот путь на моей машине, когда я бегу update-alternatives --query java-plugin.
pagliuca