Script para verificar si algún programa ya está instalado

11

¿Cómo puedo crear un script bash que verifique si un programa ya está instalado y, si no lo está, lo instala?

Gracias por tu ayuda.

Aquí está el código que tengo hasta ahora:

#/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
fuente
10
¿Pretendes sobrescribir /usr/bin?
D. Ben Knoble
1
¿Está diferenciando entre nombres de paquetes y nombres de archivos ejecutables? ¿O quieres comprobar ambos? Sólo la respuesta de George Actualmente cheques para ejecutables
Xen2050
¿Por qué quieres comprobarlo? ¿Cuál es el uso intencionado de este script?
Braiam
@Braiam Al menos con apt, la instalación de un paquete ya instalado cambiará su estado de automático a manual si solo se instaló como una dependencia de otro paquete. Si ese otro paquete se elimina más tarde, este paquete ya no se marcará para la eliminación automática. Tengo un script para instalar una lista editada de paquetes de una instalación anterior en una nueva. Esta técnica evita que ensucie el nuevo sistema.
Joe
@ Joe, que es una mala solución. En su lugar, solo debe obtener la lista de paquetes instalados y apt-mark showmanualluego instalar con algo como apt-get install "$(< package.list)".
Braiam

Respuestas:

11

Puedes hacerlo:

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

luego verifique el estado de salida. solo si el estado de salida del comando anterior era igual al 0paquete instalado .

entonces:

   #!/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
fuente
Excepto que no? ¿Qué le pasó a la línea sudo apt install $name? El comando debe pasar a la siguiente línea ... De lo contrario, buen trabajo ...
Zanna
3
Tenga en cuenta que el software se puede instalar de varias maneras y dpkgsolo es relevante para los paquetes Debian instalados. En el caso particular de OP, youtube-dlpor ejemplo, también podría instalarse a través del administrador de paquetes de Pythonpip
Sergiy Kolodyazhnyy
2
¿Por qué no if dpkg -s “$name” &> /dev/null ; then? Mismo efecto, más limpio / más claro imo.
D. Ben Knoble
de hecho, verificar el estado de salida es exactamente lo que ifhace ...
Zanna
4

Aquí hay una función que escribí para el propósito que uso en mis scripts. Comprueba si el paquete requerido está instalado y, de lo contrario, solicita al usuario que lo instale. Requiere un nombre de paquete como parámetro. Si no conoce el nombre del paquete al que pertenece un programa requerido, puede buscarlo. Información sobre eso disponible aquí.

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
}
Elder Geek
fuente
3

Esta línea de comando verificará el uso del whichprograma y regresará 0si está instalado y 1si no:

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

Por supuesto, lo usará de esta manera en su script:

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

Un uso simple sería:

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

Tenga en cuenta varias cosas:

  1. Tendrá que lidiar con problemas de dependencia mientras instala
  2. Para evitar la interacción con el script durante la instalación, consulte aquí para ver ejemplos.
  3. Puede capturar los valores de retorno de esa función y usarla para decidir si se instala o no.
George Udosen
fuente
whichEs súper no portátil. Frecuentemente uso command -ven su lugar, pero depende en gran medida del tipo de nombre que esté buscando (alias, función, ejecutable, etc.)
D. Ben Knoble
¿Súper no portátil para una pregunta que es para una máquina Ubuntu? Este no es el Unix & Linuxsitio! ¡Si estuviera respondiendo en el Unix & Linuxsitio, sería un asunto diferente!
George Udosen
3

¿Por qué quieres comprobarlo en primer lugar? A menos que tenga una buena razón para ello, no lo haga, solo apt-get install packagetermine. Si ya está instalado, se actualizará si hay una versión más nueva disponible, si está instalado y está actualizado, no pasará nada. En caso de que tenga que aplicar alguna configuración, hay otras opciones, como crear un paquete de configuración que depende del paquete o usar un software de administración de configuración como ansible.

usuario2567875
fuente
1
A menudo sucederá algo: al menos con apt, la instalación de un paquete ya instalado cambiará su estado de automático a manual si solo se instaló como una dependencia de otro paquete. Si ese otro paquete se elimina más tarde, este paquete ya no se marcará para la eliminación automática. Tengo un script para instalar una lista editada de paquetes de una instalación anterior en una nueva. Esta técnica evita que ensucie el nuevo sistema.
Joe
2

Una manera fácil de verificar los paquetes instalados usando apt-mark:

apt-mark showinstallenumerará todos los paquetes marcados como instalación (ya instalados o en cola para la instalación). Después de eso, es una simple cuestión de agarrar los paquetes que le interesan.

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

usuario535733
fuente
Estás en el camino correcto! Simplemente cámbielo a esto para eliminar los falsos positivos: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo "instalado" || echo "not"
Eric Mintz
@EricMintz: ¡gracias por la mejora! Editado
user535733