Skript, um zu überprüfen, ob bereits ein Programm installiert ist


11

Wie kann ich ein Bash-Skript erstellen, das überprüft, ob ein Programm bereits installiert ist, und wenn nicht, installiert es es?

Danke für Ihre Hilfe.

Hier ist der Code, den ich bisher habe:

#/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
Beabsichtigen Sie zu überschreiben /usr/bin?
D. Ben Knoble

1
Unterscheiden Sie zwischen Paketnamen und ausführbaren Dateinamen? Oder möchten Sie beide überprüfen? Nur Georges Antwort
sucht

Warum willst du das überprüfen? Wozu dient dieses Skript?
Braiam

@Braiam Zumindest mit apt ändert die Installation eines bereits installierten Pakets seinen Status von automatisch zu manuell, wenn es nur als Abhängigkeit von einem anderen Paket installiert wurde. Wenn dieses andere Paket später entfernt wird, wird dieses Paket nicht mehr zum automatischen Entfernen markiert. Ich habe ein Skript zum Installieren einer bearbeiteten Liste von Paketen aus einer vorherigen Installation in einer neuen. Diese Technik verhindert, dass das neue System durcheinander gebracht wird.
Joe

@ Joe, das ist eine schlechte Lösung. Sie sollten stattdessen nur die Liste der installierten Pakete abrufen und apt-mark showmanualdann mit so etwas installieren apt-get install "$(< package.list)".
Braiam

Antworten:


11

du kannst das:

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

Überprüfen Sie dann den Exit-Status. Nur wenn der Exit-Status des obigen Befehls gleich 0dem installierten Paket war .

damit:

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

Außer es nicht? Was ist mit der Leitung passiert sudo apt install $name? Der Befehl muss in die nächste Zeile gehen ... Ansonsten gute Arbeit ...
Zanna

3
Beachten Sie, dass Software auf verschiedene Arten installiert werden kann und dpkgnur für installierte Debian-Pakete relevant ist. Im speziellen Fall von OP youtube-dlkönnte zum Beispiel auch über Pythons Paketmanagerpip
Sergiy Kolodyazhnyy

2
Warum nicht if dpkg -s “$name” &> /dev/null ; then? Gleicher Effekt, sauberer / klarer imo.
D. Ben Knoble

In der Tat ist die Überprüfung des Ausgangsstatus genau das, was iftut ...
Zanna

4

Hier ist eine Funktion, die ich für den Zweck geschrieben habe, den ich in meinen Skripten verwende. Es prüft, ob das erforderliche Paket installiert ist, und fordert den Benutzer auf, es zu installieren, wenn dies nicht der Fall ist. Es erfordert einen Paketnamen als Parameter. Wenn Sie den Namen des Pakets nicht kennen, zu dem ein erforderliches Programm gehört, können Sie es nachschlagen. Informationen dazu finden Sie hier.

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

Diese Befehlszeile überprüft das whichProgramm und kehrt zurück, 0wenn es installiert ist und 1wenn nicht:

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

Natürlich werden Sie es in Ihrem Skript folgendermaßen verwenden:

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

Eine einfache Verwendung wäre:

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

Beachten Sie mehrere Dinge:

  1. Sie müssen sich bei der Installation mit Abhängigkeitsproblemen befassen
  2. Um eine Interaktion mit dem Skript während der Installation zu vermeiden, finden Sie hier Beispiele.
  3. Sie können die Rückgabewerte dieser Funktion abrufen und damit entscheiden, ob sie installiert werden sollen oder nicht.

whichist super nicht tragbar. Ich benutze command -vstattdessen häufig , aber es hängt stark von der Art des Namens ab, den Sie suchen (Alias, Funktion, ausführbare Datei
usw.

Super nicht portabel für eine Frage, die für eine Ubuntu-Maschine ist? Dies ist keine Unix & LinuxSeite! Wenn ich es vor Unix & LinuxOrt beantworten würde, wäre das eine andere Sache!
George Udosen

3

Warum möchten Sie es überhaupt überprüfen? Wenn Sie keinen guten Grund dafür haben, tun Sie es nicht, nur apt-get install packagevorbei. Wenn es bereits installiert ist, wird es aktualisiert, wenn eine neuere Version verfügbar ist. Wenn es installiert ist und auf dem neuesten Stand ist, passiert nichts. Für den Fall, dass eine Konfiguration angewendet werden muss, gibt es andere Optionen, z. B. das Erstellen eines Konfigurationspakets, das vom Paket abhängt, oder die Verwendung einer Konfigurationsverwaltungssoftware wie ansible.


1
Oft passiert etwas: Zumindest bei apt ändert die Installation eines bereits installierten Pakets seinen Status von automatisch zu manuell, wenn es nur als Abhängigkeit von einem anderen Paket installiert wurde. Wenn dieses andere Paket später entfernt wird, wird dieses Paket nicht mehr zum automatischen Entfernen markiert. Ich habe ein Skript zum Installieren einer bearbeiteten Liste von Paketen aus einer vorherigen Installation in einer neuen. Diese Technik verhindert, dass das neue System durcheinander gebracht wird.
Joe

2

Eine einfache Möglichkeit, nach installierten Paketen zu suchen, indem Sie apt-mark:

apt-mark showinstalllistet alle Pakete auf, die als installiert markiert sind (bereits installiert oder zur Installation in die Warteschlange gestellt). Danach müssen Sie nur noch die Pakete durchsuchen, die Ihnen wichtig sind.

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


Du bist auf dem richtigen Weg! Ändern Sie es einfach in dieses, um die Fehlalarme zu beseitigen: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo "installiert" || Echo "nicht"
Eric Mintz

@EricMintz - danke für die Verbesserung! Bearbeitet.
user535733
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.