Skrypt sprawdzający, czy jakiś program jest już zainstalowany

11

Jak mogę utworzyć skrypt bash, który sprawdza, czy program jest już zainstalowany, a jeśli nie jest, instaluje go?

Dzięki za pomoc.

Oto kod, który mam do tej pory:

#/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
GUILLEM NAVALON BABIA
źródło
10
Czy zamierzasz nadpisać /usr/bin?
D. Ben Knoble,
1
Czy rozróżniasz nazwy pakietów i nazwy plików wykonywalnych? A może chcesz sprawdzić oba? Obecnie tylko odpowiedź George'a sprawdza pliki wykonywalne
Xen2050,
Dlaczego chcesz to sprawdzić? Jakie jest zamierzone użycie tego skryptu?
Braiam
@Braiam Przynajmniej w przypadku apt, instalacja już zainstalowanego pakietu zmieni jego status z automatycznego na ręczny, jeśli został zainstalowany tylko jako zależność od innego pakietu. Jeśli ten inny pakiet zostanie później usunięty, ten pakiet nie będzie już oznaczony do automatycznego usunięcia. Mam skrypt do zainstalowania edytowanej listy pakietów z poprzedniej instalacji do nowej. Ta technika zapobiega bałaganowi w nowym systemie.
Joe
@Joe, co jest złym rozwiązaniem. Zamiast tego powinieneś po prostu pobrać listę zainstalowanych pakietów, a apt-mark showmanualnastępnie zainstalować coś podobnego apt-get install "$(< package.list)".
Braiam

Odpowiedzi:

11

możesz to zrobić:

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

następnie sprawdź status wyjścia. tylko jeśli status wyjścia powyższego polecenia był równy, 0wówczas pakiet został zainstalowany .

więc:

   #!/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
Hossein
źródło
Tyle że nie? Co się stało z linią sudo apt install $name? Polecenie musi przejść do następnego wiersza ... W przeciwnym razie, dobra robota ...
Zanna,
3
Zauważ, że oprogramowanie może być instalowane na różne sposoby i dpkgdotyczy tylko zainstalowanych pakietów Debiana. W szczególnym przypadku OP można youtube-dlna przykład zainstalować również za pomocą menedżera pakietów Pythonapip
Sergiy Kolodyazhnyy,
2
Dlaczego nie if dpkg -s “$name” &> /dev/null ; then? Ten sam efekt, czystsze / wyraźniejsze imo.
D. Ben Knoble,
Rzeczywiście, sprawdzania stanu wyjścia jest dokładnie to, co ifrobi ...
Zanna
4

Oto funkcja, którą napisałem w celu, którego używam w swoich skryptach. Sprawdza, czy wymagany pakiet jest zainstalowany, a jeśli nie, wyświetla monit o jego zainstalowanie. Wymaga nazwy pakietu jako parametru. Jeśli nie znasz nazwy pakietu, do którego należy wymagany program, możesz go wyszukać. Informacje na ten temat dostępne tutaj.

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
}
Starszy Geek
źródło
3

Ta linia poleceń sprawdzi za pomocą whichprogramu i zwróci, 0jeśli jest zainstalowany, a 1jeśli nie:

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

Oczywiście użyjesz go w ten sposób w swoim skrypcie:

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

Prostym zastosowaniem byłoby:

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

Zwróć uwagę na kilka rzeczy:

  1. Podczas instalacji będziesz musiał poradzić sobie z problemami zależności
  2. Aby uniknąć interakcji ze skryptem podczas instalacji, zobacz tutaj przykłady.
  3. Możesz złapać zwracane wartości z tej funkcji i użyć jej, aby zdecydować, czy zainstalować, czy nie.
George Udosen
źródło
whichjest bardzo nieprzenośny. Często używam command -vzamiast tego, ale zależy to w dużej mierze od rodzaju nazwy, której szukasz (alias, funkcja, plik wykonywalny itp.)
D. Ben Knoble
Super nieprzenośny na pytanie, które dotyczy komputera z systemem Ubuntu? To nie jest Unix & Linuxstrona! Gdybym odpowiadał na to na Unix & Linuxstronie, to byłaby inna sprawa!
George Udosen
3

Dlaczego chcesz to sprawdzić? Chyba że masz ku temu dobry powód, nie rób tego, po prostu apt-get install package. Jeśli jest już zainstalowany, zostanie zaktualizowany, jeśli dostępna jest nowsza wersja, jeśli jest zainstalowany i jest aktualny, nic się nie stanie. W przypadku niektórych konfiguracji, które należy zastosować, istnieją inne opcje, takie jak zbudowanie pakietu konfiguracyjnego, który zależy od pakietu lub użycie oprogramowania do zarządzania konfiguracją, takiego jak ansible.

użytkownik2567875
źródło
1
Coś się często zdarza: przynajmniej przy apt, instalacja już zainstalowanego pakietu zmieni jego status z automatycznego na ręczny, jeśli został zainstalowany tylko jako zależność od innego pakietu. Jeśli ten inny pakiet zostanie później usunięty, ten pakiet nie będzie już oznaczony do automatycznego usunięcia. Mam skrypt do zainstalowania edytowanej listy pakietów z poprzedniej instalacji do nowej. Ta technika zapobiega bałaganowi w nowym systemie.
Joe
2

Jednym łatwym sposobem sprawdzenia zainstalowanych pakietów za pomocą apt-mark:

apt-mark showinstallwyświetli listę wszystkich pakietów oznaczonych jako zainstalowane (już zainstalowane lub umieszczone w kolejce do instalacji). Następnie jest to prosta kwestia grepowania pakietów, na których Ci zależy.

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

użytkownik535733
źródło
Jesteś na dobrej drodze! Po prostu zmień to na, aby wyeliminować fałszywe alarmy: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo „zainstalowany” || echo „nie”
Eric Mintz,
@EricMintz - dzięki za poprawę! Edytowane.
user535733,