Script per verificare se qualche programma è già installato


11

Come posso creare uno script bash che controlla se un programma è già installato e, in caso contrario, lo installa?

Grazie per l'aiuto.

Ecco il codice che ho finora:

#/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
Intendi sovrascrivere /usr/bin?
D. Ben Knoble,

1
Stai distinguendo tra nomi di pacchetti e nomi di file eseguibili? O vuoi controllare entrambi? Al momento solo la risposta di George verifica la presenza di eseguibili
Xen2050,

Perché vuoi controllarlo? Qual è l'uso intenzionale di questo script?
Braiam,

@Braiam Almeno con apt, l'installazione di un pacchetto già installato cambierà il suo stato da automatico a manuale se fosse installato solo come dipendenza di un altro pacchetto. Se quell'altro pacchetto viene successivamente rimosso, questo pacchetto non verrà più contrassegnato per la rimozione automatica. Ho uno script per installare un elenco modificato di pacchetti da una precedente installazione in uno nuovo. Questa tecnica gli impedisce di rovinare il nuovo sistema.
Joe,

@Joe che è una cattiva soluzione. Dovresti invece ottenere l'elenco dei pacchetti apt-mark showmanualinstallati con l'installazione successiva con qualcosa del genere apt-get install "$(< package.list)".
Braiam,

Risposte:


11

Puoi farlo:

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

quindi controlla lo stato di uscita. solo se lo stato di uscita del comando sopra era uguale al 0pacchetto installato .

così:

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

Tranne che no? Che cosa è successo alla linea con sudo apt install $name? Il comando deve andare alla riga successiva ... Altrimenti, bel lavoro ...
Zanna,

3
Si noti che il software può essere installato in vari modi ed dpkgè rilevante solo per i pacchetti debian installati. Nel caso particolare di OP, youtube-dlad esempio, potrebbe essere installato anche tramite il gestore dei pacchetti di Pythonpip
Sergiy Kolodyazhnyy,

2
Perché no if dpkg -s “$name” &> /dev/null ; then? Stesso effetto, più pulito / più chiaro imo.
D. Ben Knoble,

infatti, controllare lo stato di uscita è esattamente ciò che iffa ...
Zanna,

4

Ecco una funzione che ho scritto per lo scopo che utilizzo nei miei script. Verifica se il pacchetto richiesto è installato e, in caso contrario, richiede all'utente di installarlo. Richiede un nome pacchetto come parametro. Se non conosci il nome del pacchetto a cui appartiene un programma richiesto, puoi cercarlo. Informazioni al riguardo disponibili qui.

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

Questa riga di comando verificherà utilizzando il whichprogramma e tornerà 0se installata e in 1caso contrario:

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

Naturalmente lo userai in questo modo nel tuo script:

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

Un semplice utilizzo sarebbe:

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

Nota diverse cose:

  1. Dovrai affrontare i problemi di dipendenza durante l'installazione
  2. Per evitare interazione con lo script durante l'installazione, vedere qui per esempi.
  3. Puoi prendere i valori di ritorno da quella funzione e usarli per decidere se installare o meno.

whichè super non portatile. Uso spesso command -vinvece, ma dipende molto dal tipo di nome che stai cercando (alias, funzione, eseguibile, ecc.)
D. Ben Knoble,

Super non portatile per una domanda che riguarda una macchina Ubuntu? Questo non è un Unix & Linuxsito! Se rispondessi sul Unix & Linuxposto sarebbe una questione diversa!
George Udosen,

3

Perché vuoi verificarlo in primo luogo? A meno che tu non abbia una buona ragione per farlo, non farlo, appena apt-get install packagefinito. Se è già installato, verrà aggiornato se è disponibile una versione più recente, se è installato ed è aggiornato, non accadrà nulla. Nel caso in cui sia necessario applicare una configurazione, esistono altre opzioni, come la creazione di un pacchetto di configurazione che dipende dal pacchetto o l'utilizzo di software di gestione della configurazione come ansible.


1
Accadrà spesso qualcosa: almeno con apt, l'installazione di un pacchetto già installato cambierà il suo stato da automatico a manuale se fosse installato solo come dipendenza di un altro pacchetto. Se quell'altro pacchetto viene successivamente rimosso, questo pacchetto non verrà più contrassegnato per la rimozione automatica. Ho uno script per installare un elenco modificato di pacchetti da una precedente installazione in uno nuovo. Questa tecnica gli impedisce di rovinare il nuovo sistema.
Joe,

2

Un modo semplice per verificare la presenza di pacchetti installati utilizzando apt-mark:

apt-mark showinstallelencherà tutti i pacchetti contrassegnati come installa (già installato o in coda per l'installazione). Dopodiché, si tratta semplicemente di afferrare i pacchetti a cui tieni.

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


Sei sulla strada giusta! Basta cambiarlo in questo per eliminare i falsi positivi: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo "installato" || echo "not"
Eric Mintz,

@EricMintz - grazie per il miglioramento! Modificato.
user535733 il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.