Bazı programların yüklü olup olmadığını kontrol etmek için komut dosyası


11

Bir programın yüklü olup olmadığını ve yüklü olmadığını kontrol eden bir bash betiği nasıl oluşturabilirim?

Yardımın için teşekkürler.

İşte şimdiye kadar sahip olduğum kod:

#/bin/bash

PS3="choose an option"

select opcion in "Installing_Youtube"  "exit"

do

    case $opcion in


        "Installing_Youtube")

            youtube-dl > /usr/bin
            if [ $? -eq 127 ] ; then
                echo "installing youtube"
                 apt-get update
                 apt-get install youtube-dl
                mkdir Videos
            else
                echo "Youtube already installed"
            fi

        ;;


        "exit")
            exit

10
Üzerine yazmak istiyor musunuz /usr/bin?
D. Ben Knoble

1
Paket adları ile yürütülebilir dosya adları arasında ayrım mı yapıyorsunuz? Yoksa ikisini de kontrol etmek mi istiyorsunuz? Şu anda sadece George'un cevabı yürütülebilir dosyaları kontrol ediyor
Xen2050

Neden kontrol etmek istiyorsun? Bu betiğin amaçlanan kullanımı nedir?
Braiam

@Braiam En azından apt ile, önceden yüklenmiş bir paketin yüklenmesi, yalnızca başka bir paketin bağımlılığı olarak yüklendiyse durumunu otomatikten manuel olarak değiştirir. Bu diğer paket daha sonra kaldırılırsa, bu paket artık otomatik olarak kaldırılmak üzere işaretlenmeyecektir. Önceki bir kurulumdan paketlerin düzenlenmiş bir listesini yenisine yüklemek için bir komut dosyası var. Bu teknik, yeni sistemi karıştırmasını engelliyor.
Joe

@ Kötü bir çözüm olan Joe. Bunun yerine sadece yüklü paketlerin listesini almalı ve apt-mark showmanualsonra böyle bir şeyle yüklemelisiniz apt-get install "$(< package.list)".
Braiam

Yanıtlar:


11

Bunu yapabilirsiniz:

dpkg -s <packagename> &> /dev/null

ardından çıkış durumunu kontrol edin. sadece yukarıdaki komutun çıkış durumu 0kurulu olan pakete eşitse .

yani:

   #!/bin/bash

    echo "enter your package name"
    read name

    dpkg -s $name &> /dev/null  

    if [ $? -ne 0 ]

        then
            echo "not installed"  
            sudo apt-get update
            sudo apt-get install $name

        else
            echo    "installed"
    fi

Dışında değil mi? Çizgiye ne oldu sudo apt install $name? Komutun bir sonraki satıra gitmesi gerekiyor ... Aksi takdirde, iyi çalışmalar ...
Zanna

3
Yazılımın çeşitli şekillerde dpkgkurulabileceğini ve yalnızca kurulu debian paketleri için geçerli olduğunu unutmayın. OP'nin özel durumunda, youtube-dlörneğin pip
python'un

2
Neden olmasın if dpkg -s “$name” &> /dev/null ; then? Aynı etki, daha temiz / daha temiz imo.
D. Ben Knoble

gerçekten, çıkış durumunu kontrol tam olarak ne ifolduğunu ...
Zanna

4

İşte senaryolarımda kullandığım amaçla yazdığım bir fonksiyon. Gerekli paketin kurulu olup olmadığını kontrol eder ve eğer değilse kullanıcıdan kurmasını ister. Parametre olarak bir paket adı gerektirir. Paketin adını bilmiyorsanız, gerekli bir programın ait olduğu pakete bakabilirsiniz. Kullanıma ilişkin bilgiler burada.

function getreq {
dpkg-query --show  "$1"
if [ "$?" = "0" ];
then
    echo "$1" found
else
    echo "$1" not found. Please approve installation.
    sudo apt-get install "$1"
    if [ "$?" = "0" ];
    then echo "$1" installed successfully.
    fi
fi
}

3

Bu komut satırı, whichprogramı kullanarak kontrol eder ve 0yüklüyse ve 1değilse geri döner :

which apache | grep -o apache > /dev/null &&  echo 0 || echo 1

Elbette senaryonuzda bu şekilde kullanacaksınız:

which "$1" | grep -o "$1" > /dev/null &&  echo "Installed!" || echo "Not Installed!"

Basit bir kullanım:

#!/usr/bin/env bash
set -e

function checker() { 
        which "$1" | grep -o "$1" > /dev/null &&  return 0 || return 1 
}

if checker "$1" == 0 ; then echo "Installed"; else echo "Not Installed!"; fi

Birkaç şeye dikkat edin:

  1. Yüklerken bağımlılık sorunları ile uğraşmak zorunda kalacaksınız
  2. Yükleme sırasında komut dosyasıyla etkileşimi önlemek için örnekler için buraya bakın .
  3. Yüklenip yüklenmeyeceğine karar vermek için bu işlevden döndürülen değerleri yakalayabilirsiniz.

whichsüper taşınabilir değildir. Bunun command -vyerine sık sık kullanıyorum , ancak aradığınız adın türüne bağlı (takma ad, işlev, yürütülebilir & c.)
D. Ben Knoble

Süper taşınabilir olmayan bir soru için bir Ubuntu makinesi? Burası Unix & Linuxsite değil ! Ben Unix & Linuxsitede cevap olsaydı bu farklı bir sorun olurdu!
George Udosen

3

İlk etapta neden kontrol etmek istiyorsun? Bunun için iyi bir nedeniniz olmadıkça, bunu yapma, hemen apt-get install packagebitirin. Önceden yüklenmişse, daha yeni bir sürüm varsa, yüklenir ve güncelse güncellenir, hiçbir şey olmaz. Uygulanması gereken bazı yapılandırmalarınız varsa, pakete bağlı bir yapılandırma paketi oluşturmak veya ansible gibi yapılandırma yönetimi yazılımını kullanmak gibi başka seçenekler de vardır.


1
Sıklıkla bir şey olur: En azından apt ile, önceden yüklenmiş bir paketin yüklenmesi, yalnızca başka bir paketin bağımlılığı olarak yüklendiyse durumunu otomatikten manuel hale getirecektir. Bu diğer paket daha sonra kaldırılırsa, bu paket artık otomatik olarak kaldırılmak üzere işaretlenmeyecektir. Önceki bir kurulumdan paketlerin düzenlenmiş bir listesini yenisine yüklemek için bir komut dosyası var. Bu teknik, yeni sistemi karıştırmasını engelliyor.
Joe

2

Yüklü paketleri kontrol etmenin kolay bir yolu apt-mark:

apt-mark showinstallkurulum olarak işaretlenmiş tüm paketleri listeler (önceden kurulmuş veya kurulum için sıraya alınmış). Bundan sonra, önem verdiğiniz paket (ler) i selamlamak basit bir konudur.

Misal: apt-mark showinstall | grep -q "^$PACKAGE_NAME$" && echo "installed" || echo "not"


Doğru yoldasınız! Yanlış pozitifleri ortadan kaldırmak için bunu değiştirin: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo "yüklendi" || yankı "değil"
Eric Mintz

@EricMintz - iyileştirme için teşekkürler! Düzenlenen.
user535733 23:18
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.