Script para verificar se algum programa já está instalado

10

Como criar um script bash que verifique se um programa já está instalado e, se não estiver, o instala?

Obrigado pela ajuda.

Aqui está o código que tenho até agora:

#/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
fonte
10
Você pretende substituir /usr/bin?
D. Ben Knoble
11
Você está diferenciando entre nomes de pacotes e nomes de arquivos executáveis? Ou quer verificar os dois? Atualmente, apenas a resposta de George verifica se há executáveis.
Xen2050
Por que você quer verificá-lo? Qual é o uso proposto desse script?
Braiam
@Braiam Pelo menos com o apt, a instalação de um pacote já instalado mudará seu status de automático para manual se ele foi instalado apenas como uma dependência de outro pacote. Se esse outro pacote for removido posteriormente, ele não será mais marcado para remoção automática. Eu tenho um script para instalar uma lista editada de pacotes de uma instalação anterior em uma nova. Essa técnica evita que você estrague o novo sistema.
31418 Joe
@ Joe, que é uma má solução. Em vez disso, você deve obter a lista de pacotes instalados apt-mark showmanuale instalar com algo parecido apt-get install "$(< package.list)".
Braiam

Respostas:

10

você consegue fazer isso:

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

depois verifique o status de saída. somente se o status de saída do comando acima for igual ao 0pacote instalado .

tão:

   #!/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
fonte
Exceto que não? O que aconteceu com a linha sudo apt install $name? O comando precisa ir na próxima linha ... Caso contrário, bom trabalho ...
Zanna
3
Note que o software pode ser instalado de várias maneiras e dpkgé relevante apenas para os pacotes debian instalados. No caso particular do OP, youtube-dlpor exemplo, também pode ser instalado através do gerenciador de pacotes do pythonpip
Sergiy Kolodyazhnyy
2
Por que não if dpkg -s “$name” &> /dev/null ; then? Mesmo efeito, imo mais limpo / mais claro.
D. Ben Knoble
de fato, verificando o status de saída é exatamente o que iffaz ...
Zanna
Por favor, corrija o comentário: //->#
val
4

Aqui está uma função que eu escrevi para o propósito que eu uso nos meus scripts. Ele verifica se o pacote necessário está instalado e, se não, solicita que o usuário o instale. Requer um nome de pacote como parâmetro. Se você não souber o nome do pacote ao qual pertence um programa exigido, poderá consultá-lo. Informações sobre isso disponíveis aqui.

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
fonte
3

Esta linha de comando irá verificar usando o whichprograma e retornará 0se instalado e 1se não:

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

Claro que você o usará dessa maneira em seu script:

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

Um uso simples seria:

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

Observe várias coisas:

  1. Você terá que lidar com problemas de dependência durante a instalação
  2. Para evitar a interação com o script durante a instalação, veja aqui exemplos.
  3. Você pode capturar os valores de retorno dessa função e usá-lo para decidir se deseja instalar ou não.
George Udosen
fonte
whiché super não-portátil. Eu freqüentemente usam command -vem vez disso, mas isso depende muito do tipo de nome que você está procurando (aliás, função, executável, & c.)
D. Ben Knoble
Super não-portátil para uma pergunta que é para uma máquina Ubuntu? Este não é o Unix & Linuxsite! Se eu estivesse respondendo no Unix & Linuxsite, isso seria uma questão diferente!
George Udosen
3

Por que você deseja verificá-lo em primeiro lugar? A menos que você tenha uma boa razão para isso, não faça isso apenas apt-get install package. Se já estiver instalado, será atualizado se houver uma versão mais nova disponível, se estiver instalada e atualizada, nada acontecerá. Caso você tenha alguma configuração que precise ser aplicada, existem outras opções, como criar um pacote de configuração que depende do pacote ou usar o software de gerenciamento de configuração como ansible.

user2567875
fonte
11
Algo geralmente acontece: pelo menos com o apt, a instalação de um pacote já instalado alterará seu status de automático para manual se ele foi instalado apenas como uma dependência de outro pacote. Se esse outro pacote for removido posteriormente, ele não será mais marcado para remoção automática. Eu tenho um script para instalar uma lista editada de pacotes de uma instalação anterior em uma nova. Essa técnica evita que você estrague o novo sistema.
31418 Joe
1

Uma maneira fácil de verificar os pacotes instalados usando apt-mark:

apt-mark showinstalllistará todos os pacotes marcados como instalar (já instalado ou na fila para instalação). Depois disso, é uma simples questão de saudar os pacotes com os quais você se importa.

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

user535733
fonte
Você está no caminho certo! Apenas mude para eliminar os falsos positivos: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo "instalado" || eco "not"
Eric Mintz
@ EricMintz - obrigado pela melhoria! Editado.
user535733