Kiểm tra nếu một gói được cài đặt trong APT


10

Tôi muốn một phương thức shell shell để kiểm tra / báo cáo nếu một gói được cài đặt. Tôi không cần chi tiết, chỉ trả về boolean để thiết lập luồng logic. Tôi đã xem Tìm nếu một gói được cài đặt , nhưng dpkgtrả về đầu ra phức tạp và định dạng của nó thay đổi tùy thuộc vào việc gói đó nằm trong kho Debian hay trong Ubuntu PPA.

Tôi thấy rằng apt-cacheđó là một công việc khá tốt và tôi đã đưa ra phương pháp này:

is_installed=0
test_installed=( `apt-cache policy package-name | grep "Installed:" ` )
[ ! "${test_installed[1]}" == "(none)" ] && is_installed=1

Có ai biết một cách đơn giản hơn hoặc trực tiếp hơn?

Câu trả lời:


12

dpkg-query như trong bài đăng được liên kết của bạn dường như là công cụ chính xác nhất cho công việc, ngoại trừ việc sử dụng các thư viện Python có sẵn để liên kết trực tiếp với hệ thống APT trong bối cảnh kịch bản như vậy.

Với dpkg-query:

dpkg-query -Wf'${db:Status-abbrev}' package-name 2>/dev/null | grep -q '^i'

Sẽ trả về true (trạng thái thoát 0trong shell script) nếu gói được cài đặt, false (trạng thái thoát 1) nếu không.

  • -Wcó nghĩa là "Hiển thị" ( dpkg-queryphải có hành động được yêu cầu).
  • -f thay đổi định dạng của đầu ra.
  • db:Status-abbrev là dạng ngắn của trạng thái gói.
  • 2>/dev/nullim lặng dpkg-querynếu một tên gói không hợp lệ được đưa ra. Làm thế nào điều này nên được xử lý có thể là một vấn đề trường hợp.
  • grep -q trả về true nếu có khớp, sai khác.

Nếu nó được sử dụng thường xuyên, nó có thể được thực hiện một chức năng đơn giản:

#!/bin/sh
debInst() {
    dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'
}

if debInst "$1"; then
    printf 'Why yes, the package %s _is_ installed!\n' "$1"
else
    printf 'I regret to inform you that the package %s is not currently installed.\n' "$1"
fi

hoặc chỉ đơn giản là

#!/bin/sh
if dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'; then
    printf 'Why yes, the package "%s" _is_ installed!\n' "$1"
else
    printf 'I regret to inform you that the package "%s" is not currently installed.\n' "$1"
fi

Trong khi điều này chắc chắn là đúng, tôi thấy điều đó dpkg-query -l "$package" | grep -q ^.ithường là đủ (và dễ nhớ hơn).
phogg

1
@phogg: Có, tùy thuộc vào việc nó có được cho là sống theo kịch bản hay không. Ngoài ra, dpkg-query -lđầu ra không được đặt trong đá vì nó chỉ là chế độ trình bày của người dùng, vì vậy nếu bản trình bày thay đổi có lẽ một đoạn script như vậy sẽ bị hỏng.
Daniel Andersson

@Daniel. Tôi thích cách tiếp cận mã trả về. Xin vui lòng xem câu trả lời của tôi với các chi tiết trong mã.
tahoar

Vào ngày 10.04, tùy chọn định dạng db: Trạng thái viết tắt dường như không tồn tại - Tôi đã sử dụng: dpkg-query -Wf'${Version}' ${pkg} 2>/dev/null | grep -q '^\d*'cho cùng một hiệu ứng.
scottynomad

1

Tôi đã thử nghiệm các đề xuất của Daniel trên ba gói với các kết quả sau:

  1. Gói kho lưu trữ Debian gốc chưa được cài đặt:

    ~$ dpkg-query -Wf'${db:Status-abbrev}' apache-perl
    ~$ echo $?
    1
    
  2. Gói PPA đã đăng ký trên máy chủ và được cài đặt:

    ~$ dpkg-query -Wf'${db:Status-abbrev}' libreoffice
    ~$ echo $?
    0
    
  3. Gói PPA đã đăng ký trên máy chủ nhưng chưa được cài đặt:

    ~$ dpkg-query -Wf'${db:Status-abbrev}' domy-ce
    ~$ echo $?
    0
    ~$ sudo apt-get remove domy-ce
    [sudo] password for user: 
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    Package domy-ce is not installed, so not removed
    0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
    

Mặc dù tôi thích cách tiếp cận này, có vẻ như tôi không thể tin tưởng mã trả lại với các gói PPA. Nói tóm lại, tôi nghĩ rằng tôi sẽ gắn bó với việc phân tích cú pháp trả về của apt-cache policylệnh.


Chà, ví dụ mã của bạn không phải là những gì tôi nói bạn nên làm, nhưng tôi đoán bạn vừa bỏ lỡ grepphần trong dán của bạn. Tôi thực sự không thể tái tạo vấn đề của bạn, nhưng điều đó có thể là do các ví dụ mã hiện chưa hoàn chỉnh, vì vậy vui lòng sửa nó. Bạn có chạy Debian hay Ubuntu không?
Daniel Andersson

Tôi đang chạy Ubuntu 10.04 (PPA có được hỗ trợ không có Debian không?). Mã của tôi đã bỏ grep của bạn vì 1) lệnh truy vấn dkpg không ghi gì vào thiết bị xuất chuẩn và grep luôn ném mã trả về. Mã trả về truy vấn dpkg là 0 nếu được cài đặt.
tahoar

2
1. Đừng gắn thẻ bài viết của bạn "Debian". 2. Tôi không nghĩ rằng bạn đã hiểu phần được grepchơi trong lệnh, vì vậy bạn đã tước nó và bây giờ bạn nói nó không hoạt động? grep -qcung cấp mã trả về 1nếu nó không khớp, tức là chương trình không được cài đặt hoặc không có sẵn, hoặc 0nếu chương trình được cài đặt. Tôi đã giải thích rằng trong bài viết của tôi.
Daniel Andersson

1
#!/bin/bash

# Check for dependencies 
check_deps () {
DEPS=$(echo {dialog,sqlite3,openssh-client})
for i in $DEPS ; do
    dpkg-query -W -f='${Package}\n' | grep ^$i$ > /dev/null
    if [ $? != 0 ] ; then
        echo "Installing deps ..."
        aptitude install $i -y > /dev/null
    fi
done  
}

# execute the check_deps function
check_deps

-1, câu hỏi không phải là về kiểm tra phụ thuộc. Ngoài ra, giải thích những gì các phần của lệnh đang làm: nếu không những người khác không thể thấy những gì đang xảy ra.
Daniel Andersson

DEPS=$(echo {dialog,sqlite3,openssh-client})có thể được viết tương đương như chỉ DEPS="dialog sqlite3 openssh-client".
Daniel Andersson

1

Tôi thích câu trả lời của Daniel Andersson, nhưng nó không hiệu quả với tôi. Tôi đang dùng Ubuntu 12.04.

Từ trang man dpkg , db:Status-abbrevchỉ hoạt động trong dpkg 1.16.2+:

          db:Status-Abbrev
                 It  contains the abbreviated package status, such as “ii”
                 (since dpkg 1.16.2).

Giải pháp của tôi là sử dụng hành vi kế thừa, chỉ là người Statusđịnh dạng:

dpkg-query -Wf'${Status}' {my_pkg_name}

đầu ra

install ok installed 

Tôi đoán đây là nguồn cảm hứng cho "ii" trong các đại diện khác.

Vì vậy, để hoàn toàn điều chỉnh câu trả lời của Daniel Andersson để hoạt động trên phiên bản cũ hơn của dpkg, và do đó, các bản phân phối Ubuntu cũ hơn:

dpkg-query -Wf'${Status}' {your_pkg_name} 2>/dev/null | grep -q "install ok installed"

Trả về:

  • 0 - gói được cài đặt, hoặc
  • 1 - gói KHÔNG được cài đặt.
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.