Cara yang lebih baik untuk menambahkan alternatif menggunakan pembaruan-alternatif?

16

Saya telah mencari manual update-alternativesbeberapa kali tetapi saya tidak dapat menemukan cara untuk menunjukkan tautan saat ini yang menunjuk ke alternatif tertentu, dan informasi itu diperlukan ketika menambahkan alternatif baru.

Dari update-alternativesmanual:

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

Katakanlah saya ingin menambahkan versi baru Java Runtime Edition, tetapi saya tidak tahu symlink saat ini yang tertaut ke alternatif ( <link>parameter). Apa yang saya lakukan saat ini adalah:

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

Perintah itu akan menampilkan:

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

Membaca output saya menemukan tautan lama yang menunjuk ke alternatif, jadi saya akhirnya dapat menjalankan perintah saya lagi dengan <link>parameter yang tepat , berubah /tmp/randomStuffmenjadi /usr/local/bin/java:

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

Itu berfungsi dengan baik, tetapi seperti yang Anda lihat, menjalankan perintah dengan /tmp/randomStuffsebagai <link>parameter sangat canggung.

Jadi, inilah pertanyaannya: (1) Apakah ada update-alternativeargumen yang dapat menampilkan tautan saat ini yang menunjuk ke alternatif tertentu, atau (2) apakah ada cara untuk menginstal alternatif baru tanpa harus memberikan parameter baru, cukup menjaga arus <link>?

pagliuca
sumber

Jawaban:

13

Untuk menjawab pertanyaan pertama Anda, saya ingin menyarankan Anda untuk --query:

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

Berbekal ini, Anda akan mendapatkan sumber tautan, misalnya dalam kasus saya untuk java:

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

Jadi, Anda lihat rantai saya seperti /usr/bin/java -> /etc/alternatives/java -> ....

Sayangnya, saya tidak punya jawaban untuk pertanyaan kedua Anda. Saya sudah mencari solusi untuk ini beberapa waktu yang lalu, tetapi sepertinya belum ada solusi sederhana. Yang bisa Anda lakukan adalah menulis beberapa hack untuk mengurai output --querypanggilan, mungkin seperti ini:

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

yang kemudian dapat Anda gunakan sebagai input untuk --installpanggilan. Tapi karena ini agak berantakan menurut saya, saya tidak akan merekomendasikannya. Sebaliknya, Anda mungkin ingin melihat galternatives, front-end ke sistem alternatif. Bahkan jika saya tidak suka menggunakan hal-hal grafis untuk pekerjaan dasar seperti itu cukup nyaman dan saya akhirnya menggunakan alat ini bukan alat baris perintah.

EDIT

Saya sudah penasaran bagaimana update-alternativestahu apa symlink perintah dan mengambil melihat sekilas ke sumber. Tentu saja sistem alternatif harus menyimpan konfigurasi untuk setiap grup dan ternyata itu disebut direktori administratif dan ditulis pada halaman manual ;-)

Anda akan menemukan informasi ini di /var/lib/dpkg/alternatives(secara default). Baris kedua di masing-masing file ini mendefinisikan tautan utama yang Anda cari. Anda dapat mengekstraknya seperti ini:

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

Namun, ini hanya solusi bagi mereka yang memiliki versi lebih lama update-alternatives.

binfalse
sumber
Terima kasih telah menjawab, tetapi versi pembaruan-alternatif yang saya jalankan (1.16.1.2) tidak menunjukkan informasi tautan yang menggunakan --query atau --display. Versi apa yang Anda gunakan? 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
Saya sudah 1.16.10menginstal. Tidak bisakah Anda memperbarui versinya?
binfalse
Kamulah orangnya! Kedua solusi itu luar biasa!
pagliuca
6

Pertanyaan simpleton di sini: Bukankah <link>selalu akan sama dengan yang diambil oleh yang sederhana which [program]karena itu adalah tautan yang digunakan sistem untuk memanggil program dengan command-line?

Misalnya, melacak kembali tautan untuk pycharm yang saya dapatkan:

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*

Dan saya kemudian dapat menggunakan:

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

Untuk menginstal pycharm baru saya.

Maka mungkin Anda bisa membuat skrip untuk menggunakan output dari which.

martshal
sumber
Terima kasih atas tipnya, tetapi ada kalanya itu tidak akan membantu. Saya dulu update-alternativesjuga melacak plugin java dan flash untuk firefox, dan saya selalu lupa path "/ usr / lib / mozilla / plugins" di mana saya harus meletakkan plugin itu. Saya tidak dapat menemukan jalur itu menggunakan whichatau whereisatau perintah apa pun yang muncul di benak saya, sedangkan jawaban dari @binfalse mengembalikan jalur itu ke komputer saya ketika saya menjalankannya update-alternatives --query java-plugin.
pagliuca