Tôi có thể xem tại sao một gói được cài đặt?


112

Đối với một gói cụ thể, tôi có thể tìm hiểu tại sao nó được cài đặt không?

Vì vậy, tôi có thể thấy hoặc nó được cài đặt thủ công hay nó được cài đặt như một phần phụ thuộc của gói khác? Hoặc nó được cài đặt như một phần của bản phân phối?


Điều này có liên quan đến (một phần) câu hỏi này , xem câu trả lời này để biết chi tiết.
koushik

Câu trả lời tốt hơn nhiều cho năm 2017 tại đây: Askubfox.com/questions/128524/ mẹo
Lambart

Câu trả lời:


107

Một giải pháp nhanh chóng là nhập lệnh sau trong một thiết bị đầu cuối:

aptitude why $package

hoặc, nếu bạn chỉ quan tâm đến nguyên nhân cuối cùng:

aptitude why $package --show-summary

Thay thế gói $ bằng tên của gói và trước tiên bạn có thể cần cài đặt aptitudegói.

Đây là đầu ra bạn có thể nhận được cho aptitude why aspell --show-summary

Packages requiring aspell:
  inkscape

Để biết thêm chi tiết bạn sẽ chạy aptitude why aspell. Bạn có thể đọc kết quả đầu ra, bên dưới, như sau: "Bạn đã cài đặt thủ công inkscape, yêu cầu libgtkspell, yêu cầu libenchantic2a, yêu cầu aspell". ( iđiểm đánh dấu chỉ các gói đã cài đặt; Ađiểm đánh dấu chỉ các gói được cài đặt tự động.)

i   inkscape       Depends libgtkspell0 (>= 2.0.10)                                                                    
i A libgtkspell0   Depends libenchant1c2a (>= 1.6.0)                                                                   
i A libenchant1c2a Depends aspell-en | myspell-dictionary | aspell-dictionary | ispell-dictionary | hunspell-dictionary
i A aspell-en      Depends aspell (>= 0.60.3-2)

Cuối cùng, lệnh sau

apt-cache rdepends --installed $package

liệt kê các gói khác được cài đặt trên máy tính của bạn phụ thuộc trực tiếp vào gói $ . Bạn có thể thêm --recursetùy chọn để liệt kê tất cả các gói phụ thuộc trực tiếp hoặc gián tiếp vào nó.


Mặc định đáng tiếc không bao gồm mặc định :(
badp

1
@badp cảm ơn bạn chỉ ra. Đây là điểm mới tồi tệ với maverick, chỉ để tiết kiệm một số không gian trên hình ảnh iso của livecd. Nhưng nó là một công cụ vô giá, và tôi sẽ không đi mà không có.
enzotib

15
apt-cache rdepends --recurse $packagecó thể cho quá nhiều gói Tôi sẽ thêm --installedtùy chọn để hạn chế các gói đã cài đặt. -itùy chọn hạn chế các gói liên quan đến sự phụ thuộc trước và phụ thuộc. Nhưng một gói có thể được cài đặt bởi vì nó được khuyến nghị bởi gói khác. Để đưa khuyến nghị relateded gói như vậy, tôi cho rằng điều này sẽ cung cấp cho những cái đúng:apt-cache rdepends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --installed --recurse $package
Jarno

4
ngắn hơn một chút tương đương với câu thần chú của @ jarno, giả sử bạn đang sử dụng bash hoặc shell khác với mở rộng apt-cache rdepends --no-{suggests,conflicts,breaks,replaces,enhances} --installed --recurse $package
niềng răng

30

Có thể tìm ra lý do nhanh và ngắn về lý do tại sao một gói nhất định được cài đặt bằng cách nhập lệnh sau vào terminal ( Applications -> Accessories -> Terminal):

aptitude why <package-name>

Thay thế bằng tên của gói bạn quan tâm. Ví dụ: nhập aptitude why libgoo-canvas-perlkết quả như sau:

i   shutter Suggests libgoo-canvas-perl

Điều này về cơ bản có nghĩa là gói shuttertrong trường hợp này đã đề nghị libgoo-canvas-perlđược cài đặt. Sau đó gõ aptitude why shuttertôi có thể đi lên chuỗi phụ thuộc.

Tuy nhiên có một lời cảnh báo. Tôi thường nhận thấy năng khiếu tìm ra lời giải thích hợp lý nhất cho tình huống có thể không phải là trường hợp thực tế, tuy nhiên sẽ cung cấp cho bạn một manh mối để nhìn xa hơn.

Trong trường hợp của tôi, shutterđề xuất libgoo-canvas-perl- tuy nhiên, các gói được đề xuất không được cài đặt tự động theo mặc định. Tuy nhiên, nó khiến tôi nhớ về "trải nghiệm" mà không thể chỉnh sửa ảnh chụp màn hình shutterkhiến tôi phải cài đặt thủ côngligbgoo-canvas-perl

Cuối cùng, bạn có thể tìm hiểu xem một gói được cài đặt tự động (có nghĩa là do hệ thống quản lý gói quyết định là bắt buộc khi xem xét các phụ thuộc và đề xuất của các gói khác mà bạn yêu cầu cài đặt) bằng cách chạy lệnh sau.

aptitude show <package-name>

Điều này sẽ xuất ra một dòng như dưới đây (dòng thứ 3 của đầu ra):

Automatically installed: no

Để biết thêm thông tin chạy info aptitude(trong một thiết bị đầu cuối) hoặc truy cập trang wiki Aptitude

Để tìm hiểu khi một gói cụ thể được cài đặt, có 2 tùy chọn:

  1. Trình quản lý gói Synaptic duy trì nhật ký lịch sử của tất cả các hoạt động. Để xem tệp nhật ký lịch sử, chọn Lịch sử từ menu Tệp. Bạn có thể tìm kiếm Install(nhớ trường hợp) để liệt kê tất cả các mục liên quan đến cài đặt. Tuy nhiên, điều này sẽ chỉ hiển thị các gói được cài đặt bằng Synaptic
  2. Chạy lệnh sau trong một thiết bị đầu cuối. Điều này sẽ tìm kiếm nhật ký dpkg cho các mục lịch sử cài đặt. Tuy nhiên, có giới hạn tối đa về số lượng các bản ghi này được giữ lại, vì vậy nếu gói bạn đang tìm kiếm đã được cài đặt từ lâu, bạn có thể không tìm thấy nó. Thêm chi tiết tại đây

    zcat -f /var/log/dpkg.log* | grep "\ install\ " | grep -i <package-name>
    

1
Nếu bạn muốn tìm hiểu khi nào một gói được cài đặt hoặc nâng cấpzcat -f /var/log/dpkg.log* | grep -i PackageName | egrep “\ install\ |\ upgrade\ “
Chris Good

@Chrisood: bạn có thể nhập lại bình luận của mình mà không có trích dẫn thông minh, vì vậy nó có thể sao chép / dán được không?
Dan Dascalescu

1
Cảm ơn đã chỉ ra rằng. Với dấu ngoặc kép chính xác: zcat -f /var/log/dpkg.log* | grep -i Gói Tên | egrep "\ install \ | \ nâng cấp \"
Chris Tốt

12

Vâng, bạn có thể, và thực tế đó là một mệnh lệnh khá rõ ràng. Giả sử bạn đã cài đặt năng khiếu, bạn có thể mở loại quảng cáo Terminal Window:

aptitude why package

Điều đó sẽ đưa ra một danh sách các gói phụ thuộc vào gói cụ thể đó. Nếu đó là gói được cài đặt thủ công, nó sẽ có nội dung như "Không thể tìm thấy lý do để cài đặt gói".


5

Đây là một cách đơn giản không dựa vào aptitude, mà 10.10 không được gửi theo mặc định nữa.

Đồ họa

Mở Synaptic và cố gắng loại bỏ nó.

Nếu một hộp thoại bật lên yêu cầu bạn xóa các gói khác, thì đó là các gói (theo cách đệ quy) phụ thuộc vào nó.

Từ thiết bị đầu cuối

apt-get remove package_name_goes_here -s

Một lần nữa, các gói sẽ bị loại bỏ do kết quả là tất cả các gói (theo đệ quy) phụ thuộc vào nó. ( -sTham số cho biết apt-getkhông thực sự loại bỏ gói.)


2
Đây là một giải pháp rủi ro vì nó thực sự có thể loại bỏ gói và tất cả các phụ thuộc nếu họ bấm nhầm.
ImaginaryRobots

1
@ImaginaryRobots, đó là rất nhiều sai lầm . (Bạn phải bấm nhầm Ok vào hộp thoại đầu tiên, sau đó Áp dụng, rồi lại Ok trên hộp thoại xác nhận.) Đối với phiên bản đầu cuối, bạn cũng cần thêm một y/Nyêu cầu xác nhận nếu bạn đánh máy -s. Tôi đã thêm một cảnh báo tuy nhiên.
badp

1
-1 vì thông tin này có sẵn trong Synaptic trong tab phụ thuộc, khi xem các thuộc tính của gói.
alexanderpas

@alex không chính xác - hộp thoại đó không cho bạn biết gói đó được cài đặt thủ công hay tự động. PS: Thiết lập lại bộ đếm hộp thư đến, cố gắng hơn nữa.
badp

@badp không, nhưng thông tin đó có thể được tìm thấy với bộ lọc trạng thái "Đã cài đặt (thủ công)" trên màn hình chính và có thể được nhìn thấy trong menu gói khi bạn chọn gói.
alexanderpas
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.