Bir paketin APT'de kurulu olup olmadığını test edin


8

Bir paket kurulup kurulmadığını test etmek / raporlamak için bir kabuk betiği yöntemi istiyorum. Ayrıntılara ihtiyacım yok, sadece mantık akışını ayarlamak için boolean dönüş. a baktım Bir paket kurulup kurulmadığını bulun , fakat dpkg karmaşık çıktıyı döndürür ve formatı paketin Debian deposunda mı yoksa bir Ubuntu PPA'da mı olduğuna bağlı olarak değişir.

onu buldum apt-cache oldukça iyi bir iş çıkarıyor ve bu yöntem ile geldim:

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

Daha basit veya daha doğrudan bir yol bilen var mı?

Yanıtlar:


11

dpkg-query Bağlantılı postanızdaki gibi, örneğin, kullanmanız dışında iş için en doğru araç gibi görünüyor. Böyle bir betik bağlamında doğrudan APT sistemine bağlanmak için mevcut Python kütüphaneleri.

İle dpkg-query:

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

True döndürür (çıkış durumu 0 Kabuk komut dosyasında) paket kuruluysa false (çıkış durumu) 1 ) aksi takdirde.

  • -W "Göster" anlamına gelir ( dpkg-query İstenilen bir işlem yapılması gerekir).
  • -f çıktının biçimini değiştirir.
  • db:Status-abbrev paket durumunun kısa şeklidir.
  • 2>/dev/null sessizlikler dpkg-query geçersiz bir paket adı verilirse. Bunun nasıl ele alınması gerektiği, durumdan davaya bir sorun olabilir.
  • grep -q Bir eşleşme varsa true, aksi takdirde false döndürür.

Sık kullanılırsa, basit bir fonksiyon yapılabilir:

#!/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

ya da sadece basit

#!/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

Bu şüphesiz doğru olsa da onu buluyorum dpkg-query -l "$package" | grep -q ^.i genellikle yeterlidir (ve hatırlanması kolaydır).
phogg

1
@ phogg: Evet, bir senaryoda yaşaması gerekip gerekmediğine bağlıdır. Ayrıca dpkg-query -l çıktı, yalnızca bir kullanıcı sunum modu olduğundan taşa ayarlanmadı, bu nedenle sunum belki de böyle bir komut dosyasını bozarsa bozulur.
Daniel Andersson

@Daniel. Dönüş kodu yaklaşımını seviyorum. Lütfen koddaki detaylarla ilgili cevabımı gör.
tahoar

10.04'te db formatı seçeneği: Status-kısaltması görünmüyor - Kullandım: dpkg-query -Wf'${Version}' ${pkg} 2>/dev/null | grep -q '^\d*' Aynı etki.
scottynomad

1

Daniel'in önerilerini üç paket üzerinde bu sonuçlarla test ettim:

  1. Yerel Debian depo paketi kurulu değil:

    ~$ dpkg-query -Wf'${db:Status-abbrev}' apache-perl
    ~$ echo $?
    1
    
  2. PPA paketi ana bilgisayara kaydedildi ve kuruldu:

    ~$ dpkg-query -Wf'${db:Status-abbrev}' libreoffice
    ~$ echo $?
    0
    
  3. PPA paketi ana bilgisayara kaydedildi ancak yüklenmedi:

    ~$ 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.
    

Bu yaklaşımı sevmeme rağmen, dönüş koduna PPA paketleri ile güvenemiyorum. Kısacası, sanırım geri dönüşünü ayrıştırmaya devam edeceğim. apt-cache policy Komut.


Kod örneklerin yapman gerektiğini söylediğim şey değil, ama sanırım özledim. grep Yapıştırmanın bir parçası. Sorununuzu gerçekten yeniden oluşturamıyorum, ancak bu, kod örneklerinin şu anda eksik olması nedeniyle olabilir, bu nedenle lütfen düzeltin. Debian veya Ubuntu kullanıyor musunuz?
Daniel Andersson

Ubuntu 10.04 kullanıyorum (PPA destekleniyor mu Debian yok?). Kodum grep'inizi düşürdü çünkü 1) dkpg-query komutu stdout'a hiçbir şey yazmadı ve grep her zaman bir dönüş kodu atar. Kuruluysa, dpkg-query returncode 0'dır.
tahoar

2
1. "Debian" yayınınızı o zaman etiketlemeyin. 2. Bölümü anladığını sanmıyorum grep komutta oynadı, sen onu soydun, ve şimdi işe yaramadığını mı söyledin? grep -q dönüş kodu verir 1 Eğer o değil eşleş, yani program değil yüklü veya kullanılamıyor veya 0 program kurulu ise. Bunu görevimde açıkladım.
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, soru bağımlılık kontrolü ile ilgili değil. Ayrıca, komutun bölümlerinin ne yaptığını da açıklayın: aksi halde diğer insanlar neler olduğunu göremez.
Daniel Andersson

DEPS=$(echo {dialog,sqlite3,openssh-client}) eşit olarak aynı şekilde yazılabilir DEPS="dialog sqlite3 openssh-client".
Daniel Andersson

1

Daniel Andersson'un cevabını beğendim ama bu benim için işe yaramadı. 12.04 Ubuntu'dayım.

İtibaren dpkg man sayfası , db:Status-abbrev sadece dpkg 1.16.2+ ile çalışır:

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

Benim çözümüm eski davranışları kullanmaktı. Status biçimlendirici:

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

çıktılar

install ok installed 

Diğer temsillerde "ii" nin ilham kaynağı olduğunu tahmin ediyorum.

Böylece, Daniel Andersson’un cevabını dpkg’ın eski sürümünde ve dolayısıyla eski Ubuntu’nun dağıtımında çalışmak üzere tamamen uyarlamak:

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

İade:

  • 0 - paket kurulu veya
  • 1 - paket yüklü değil.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.