Melhor maneira de adicionar alternativas usando as alternativas de atualização?


16

Eu procurei o manual update-alternativesvárias vezes, mas não consigo descobrir como mostrar o link atual apontando para uma alternativa específica, e essas informações são necessárias ao adicionar uma nova alternativa.

Do update-alternativesmanual:

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

Digamos que eu queira adicionar uma nova versão do Java Runtime Edition, mas não conheço o link simbólico atual que vincula a alternativa ( <link>parâmetro). O que eu faço atualmente é:

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

Esse comando produzirá:

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

Lendo a saída, descubro o link antigo que estava apontando para a alternativa, para que eu possa finalmente executar meu comando novamente com o <link>parâmetro correto , alterando /tmp/randomStuffpara /usr/local/bin/java:

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

Isso funciona bem, mas, como você vê, executar o comando com /tmp/randomStuffo <link>parâmetro é muito complicado.

Portanto, aqui estão as perguntas: (1) existem update-alternativeargumentos que podem gerar o link atual que está apontando para uma alternativa específica ou (2) existe uma maneira de instalar uma nova alternativa sem precisar fornecer um novo parâmetro, simplesmente mantendo a corrente <link>?

Respostas:


13

Para responder à sua primeira pergunta, gostaria de sugerir que você --query:

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

Armado com isso, você obterá a fonte do link, por exemplo, no meu caso para java:

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

Então, você vê minha corrente como está /usr/bin/java -> /etc/alternatives/java -> ....

Infelizmente, não tenho resposta para sua segunda pergunta. Estou procurando uma solução para isso há algum tempo, mas parece que ainda não há uma solução alternativa simples. O que você pode fazer é escrever um hack para analisar a saída da --querychamada, talvez assim:

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

que você poderia usar como entrada para a --installchamada. Mas como isso é bastante confuso na minha opinião, não o recomendo. Em vez disso, você pode querer dar uma olhada galternatives, um front-end para o sistema de alternativas. Mesmo que eu não goste de usar coisas gráficas para trabalhos tão básicos, é bastante conveniente e acabei usando essa ferramenta em vez das ferramentas de linha de comando.

EDITAR

Fiquei curioso para update-alternativessaber como é o link simbólico do comando e dei uma rápida olhada nas fontes. É claro que o sistema alternativo precisa armazenar a configuração de cada grupo e isso se chama diretório administrativo e escrito na página de manual ;-)

Você encontrará essas informações em /var/lib/dpkg/alternatives(por padrão). A segunda linha em cada um desses arquivos define o link principal que você está procurando. Você pode extraí-lo assim:

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

No entanto, esta é apenas uma solução alternativa para aqueles que possuem uma versão mais antiga do update-alternatives.


Obrigado por responder, mas a versão das alternativas de atualização que estou executando (1.16.1.2) não mostra informações de link usando --query ou --display. Qual versão você está usando? 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

Eu 1.16.10instalei. Você não pode atualizar sua versão?
binfalse

Você é o cara! Ambas as soluções são excelentes!
Paginuca

6

Pergunta simplória aqui: o <link>sempre será o mesmo recuperado por um simples, which [program]já que esse é o link que o sistema usa para chamar um programa por linha de comando?

Por exemplo, rastreando os links para pycharm, recebo:

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*

E então eu posso usar:

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

Para minha nova instalação do pycharm.

Talvez você possa construir um script para usar a saída de which.


Obrigado pela dica, mas há momentos em que isso não será útil. Eu update-alternativestambém uso para rastrear plugins java e flash no firefox, e sempre esqueço o caminho "/ usr / lib / mozilla / plugins" onde devo colocá-los. Não consigo descobrir esse caminho usando whichou whereisou qualquer comando que me vem à cabeça, enquanto a resposta de @binfalse retorna corretamente esse caminho na minha máquina quando executo update-alternatives --query java-plugin.
Paginuca
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.