Cách tốt hơn để thêm thay thế bằng cách sử dụng cập nhật thay thế?


16

Tôi đã tra cứu hướng dẫn update-alternativesnhiều lần nhưng tôi không thể tìm ra cách hiển thị liên kết hiện tại chỉ đến một lựa chọn cụ thể và thông tin đó là cần thiết khi thêm một thay thế mới.

Từ update-alternativeshướng dẫn:

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

Giả sử tôi muốn thêm một phiên bản Java Runtime Edition mới, nhưng tôi không biết liên kết tượng trưng hiện tại liên kết đến thay thế ( <link>tham số). Những gì tôi hiện đang làm là:

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

Lệnh đó sẽ xuất ra:

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

Đọc kết quả đầu ra tôi tìm ra liên kết cũ đã trỏ đến thay thế, vì vậy cuối cùng tôi có thể chạy lại lệnh của mình với <link>tham số phù hợp , thay đổi /tmp/randomStuffthành /usr/local/bin/java:

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

Đó là hoạt động tốt, nhưng như bạn thấy, chạy lệnh với /tmp/randomStuff<link>tham số là rất khó xử.

Vì vậy, đây là câu hỏi: (1) Có bất kỳ update-alternativeđối số nào có thể xuất ra liên kết hiện tại đang trỏ đến một thay thế cụ thể không, hoặc (2) có cách nào để cài đặt một thay thế mới mà không phải cung cấp một tham số mới, chỉ đơn giản là giữ hiện tại <link>?

Câu trả lời:


13

Để trả lời câu hỏi đầu tiên của bạn, tôi muốn gợi ý cho bạn --query:

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

Được trang bị điều này, bạn sẽ nhận được nguồn liên kết, ví dụ như trong trường hợp của tôi cho java:

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

Vì vậy, bạn thấy chuỗi của tôi đi như thế nào /usr/bin/java -> /etc/alternatives/java -> ....

Thật không may, tôi không có câu trả lời cho câu hỏi thứ hai của bạn. Tôi đã tìm kiếm một giải pháp cho điều này một thời gian trước đây, nhưng có vẻ như không có cách giải quyết đơn giản nào. Những gì bạn có thể làm là viết một số hack để phân tích đầu ra của --querycuộc gọi, có thể như thế này:

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

mà sau đó bạn có thể sử dụng làm đầu vào cho --installcuộc gọi. Nhưng vì điều này khá lộn xộn theo quan điểm của tôi, tôi sẽ không đề xuất nó. Thay vào đó, bạn có thể muốn có một cái nhìn galternatives, một mặt trước cho hệ thống thay thế. Ngay cả khi tôi không thích sử dụng công cụ đồ họa cho các công việc cơ bản như vậy thì nó vẫn khá thuận tiện và cuối cùng tôi đã sử dụng công cụ này thay vì các công cụ dòng lệnh.

BIÊN TẬP

Tôi đã tò mò làm thế nào để update-alternativesbiết symlink lệnh là gì và xem qua các nguồn. Tất nhiên, hệ thống thay thế phải lưu trữ cấu hình cho từng nhóm và hóa ra nó được gọi là thư mục quản trị và được viết trên trang man ;-)

Bạn sẽ tìm thấy thông tin này trong /var/lib/dpkg/alternatives(theo mặc định). Dòng thứ hai trong mỗi tệp này xác định liên kết chính bạn đang tìm kiếm. Bạn có thể giải nén nó như thế này:

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

Tuy nhiên, đây chỉ là một cách giải quyết cho những người có phiên bản cũ hơn update-alternatives.


Cảm ơn bạn đã trả lời, nhưng phiên bản cập nhật thay thế mà tôi đang chạy (1.16.1.2) không hiển thị thông tin liên kết bằng cách sử dụng --query hoặc --display. Phiên bản nào bạn đang sử dụng? 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

Tôi đã 1.16.10cài đặt. Bạn không thể cập nhật phiên bản của bạn?
binfalse

Bạn là người đàn ông! Cả hai giải pháp đều tuyệt vời!
pagliuca

5

Câu hỏi đơn giản ở đây: Không phải <link>luôn luôn là cùng một câu hỏi được lấy bởi một đơn giản which [program]vì đó là liên kết mà hệ thống sử dụng để gọi một chương trình bằng dòng lệnh?

Ví dụ, truy tìm lại các liên kết cho pycharm tôi nhận được:

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*

Và sau đó tôi có thể sử dụng:

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

Đối với cài đặt pycharm mới của tôi.

Sau đó, có lẽ bạn có thể xây dựng một tập lệnh để sử dụng đầu ra của which.


Cảm ơn vì tiền boa, nhưng có những lúc điều đó sẽ không hữu ích. Tôi update-alternativescũng thường theo dõi các plugin java và flash cho firefox và tôi luôn quên đường dẫn "/ usr / lib / mozilla / plugin" nơi tôi nên đặt các plugin đó. Tôi không thể tìm ra đường dẫn đó bằng cách sử dụng whichhoặc whereisbất kỳ lệnh nào xuất hiện trong đầu tôi, trong khi câu trả lời từ @binfalse trả lại chính xác đường dẫn đó trên máy của tôi khi tôi chạy update-alternatives --query java-plugin.
pagliuca
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.