Verifique se todos os pacotes listados estão instalados no bash

9

Meu binário depende dessas bibliotecas de impulso e respectivos pacotes:

NAME                                  |          PACKAGE:
--------------------------------------+-----------------------------------
libboost_serialization.so.1.55.0      |  libboost-serialization1.55.0
libboost_thread.so.1.55.0             |  ibboost-thread1.55.0
libboost_date_time.so.1.55.0          |  libboost-date-time1.55.0
libboost_signals.so.1.55.0            |  libboost-signals1.55.0

Então, eu gostaria de definir uma lista de pacotes:

boostlibnames="libboost-serialization1.55.0 libboost-thread1.55.0 libboost-date-time1.55.0 libboost-signals1.55.0"

E agora eu gostaria de verificar se todos eles estão instalados e só então são executados de verdade apt-get install. Eu sei que o apt verificará automaticamente se os pacotes já estão instalados, mas eu gostaria de informar o usuário se ele deseja instalar as bibliotecas ausentes antes de fazê-lo.

Existe uma boa maneira de verificar se todas as bibliotecas listadas (na variável acima) estão instaladas?

Tomáš Zato - Restabelecer Monica
fonte
Criar um pacote Debian adequada e deixe punho apt as dependências
ivanivan
@ivanivan É um aplicativo interno da empresa e, claro, não é de código aberto.
Tomáš Zato - Restabelece Monica
Não significa que você precise distribuir o arquivo deb ou qualquer outra coisa além da sua empresa interna ... basta usar a resolução de dependência dos sistemas de empacotamento. Heck, use o método neste q / a para criar um pacote falso para instalar os deps - unix.stackexchange.com/questions/318117/…
ivanivan

Respostas:

13

O dpkg -scomando retorna o status dos pacotes instalados. Por exemplo, no meu sistema, se eu executá-lo para o firefoxque está instalado e o neditque não está, recebo:

$ dpkg -s firefox
Package: firefox
Status: install ok installed
Priority: optional
Section: web
Installed-Size: 94341
Maintainer: Clement Lefebvre <root@linuxmint.com>
Architecture: amd64
Version: 41.0~linuxmint1+betsy
Replaces: firefox-l10n-af, firefox-l10n-ar, firefox-l10n-be, firefox-l10n-bg, firefox-l10n-bn-bd, firefox-l10n-ca, firefox-l10n-cs, firefox-l10n-da, firefox-l10n-de, firefox-l10n-el, firefox-l10n-en-gb, firefox-l10n-en-us, firefox-l10n-eo, firefox-l10n-es, firefox-l10n-et, firefox-l10n-eu, firefox-l10n-fa, firefox-l10n-fi, firefox-l10n-fr, firefox-l10n-fy, firefox-l10n-gl, firefox-l10n-gu, firefox-l10n-he, firefox-l10n-hi, firefox-l10n-hr, firefox-l10n-hu, firefox-l10n-id, firefox-l10n-is, firefox-l10n-it, firefox-l10n-ja, firefox-l10n-kn, firefox-l10n-ko, firefox-l10n-lt, firefox-l10n-lv, firefox-l10n-nb, firefox-l10n-nl, firefox-l10n-nn, firefox-l10n-pl, firefox-l10n-pt, firefox-l10n-pt-br, firefox-l10n-ro, firefox-l10n-ru, firefox-l10n-sk, firefox-l10n-sl, firefox-l10n-sq, firefox-l10n-sr, firefox-l10n-sv, firefox-l10n-th, firefox-l10n-tr, firefox-l10n-uk, firefox-l10n-zh
Provides: gnome-www-browser, www-browser
Breaks: firefox-l10n-en-us
Description: The Firefox web browser
 The Mozilla Firefox Web Browser.

$ dpkg -s nedit
dpkg-query: package 'nedit' is not installed and no information is available
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.

Portanto, você pode usar esse comando para verificar se um pacote está instalado:

#!/usr/bin/env bash

run_install()
{
    ## Prompt the user 
    read -p "Do you want to install missing libraries? [Y/n]: " answer
    ## Set the default value if no answer was given
    answer=${answer:Y}
    ## If the answer matches y or Y, install
    [[ $answer =~ [Yy] ]] && apt-get install ${boostlibnames[@]}
}

boostlibnames=("libboost-serialization1.55.0" "libboost-thread1.55.0"
                "libboost-date-time1.55.0" "libboost-signals1.55.0" "nedit")
## Run the run_install function if sany of the libraries are missing
dpkg -s "${boostlibnames[@]}" >/dev/null 2>&1 || run_install
terdon
fonte
Existe alguma maneira curta de salvar resultados? Por exemplo. em C / C ++ eu faria installed = installed || isInstalled(libArray[i]). Da mesma forma, eu gostaria de colocar false em uma variável se um ou mais não foram instalados. Eu acho que posso fazer isso com if, mas isso é muito código para nada.
Tomáš Zato - Restabelece Monica
@ TomášZato sim, mas você terá que ser mais específico. Deseja salvar a lista de bibliotecas ausentes? É apenas um o suficiente? Pessoalmente, eu apenas verificaria se todos estão instalados e, se pelo menos um não estiver, seria executado apt-get installem todos eles. Qualquer um que esteja instalado será simplesmente ignorado. Deixe-me saber o que você quer e eu vou editar isso. Basicamente, você precisará alterar o || echo ...para || installed=1ou algo assim.
terdon
Eu queria fazer exatamente o que você faz, é um esforço desperdiçado para salvar a lista de bibliotecas ausentes. Basta verificar todos eles e, se houver algum, solicitar ao apt-get o usuário. Eu já tenho seu código trabalhando com uma ifinstrução feia , mas a variável seria preferida. Eu pretendo envolvê-lo em uma função.
Tomáš Zato - Restabelece Monica
@ TomášZato OK, dê uma olhada na resposta atualizada. Eu simplifiquei um pouco, pois dpkg -spode verificar vários pacotes ao mesmo tempo.
terdon
1

Eu fiz essa função para um sistema CentOS hoje.

#!/bin/bash

# List of the packages that should be present
list=("vim-enhanced" "nano" "expect" "dialog" "epel-release" "yum-utils" "bind-utils")

# Check for the existence of the packages in the system and print to file.txt the packages to be installed
check_list=$(rpm -q "${list[@]}" | grep -e "not installed" | awk 'BEGIN { FS = " " } ; { print $2}' > list.txt)

# Check if the list.txt is empty
grep -q '[^[:space:]]' < list.txt
EMPTY_FILE=$?
# If list.txt is empty there's nothing to do
if [[ $EMPTY_FILE -eq 1 ]]; then

echo "Nothing to do"

else

# If list.txt is not empty it installs the packages in list.txt

for PACKAGES in `cat /your/path/list.txt`; do

  yum install -y $PACKAGES

done

fi

Bem, modifiquei levemente a função. Mais rápido e não precisa mais de um loop.

#!/bin/bash


list=("vim-enhanced" "nano" "expect" "dialog" "epel-release" "yum-utils" "bind-utils")
check_list=$(rpm -q "${list[@]}" | grep -e "not installed" | awk 'BEGIN { FS = " " } ; { printf $2" "}' > /your/path/to/list.txt)
install=$(cat /your/path/to/list.txt)

grep -q '[^[:space:]]' < /your/path/to/list.txt

EMPTY_FILE=$?

if [[ $EMPTY_FILE -eq 1 ]]; then

echo "Nothing to do"

else

yum install -y $install

fi

O equivalente do Debian / Ubuntu:

apt -qq YOUR_LIST_GOES_HERE | grep -v "installed" | awk -F/ '{print $1}' > /your/path/to/list.txt
packages=$(cat /your/path/to/list.txt)
grep -q '[^[:space:]]' < /your/path/to/list.txt
EMPTY_FILE=$?
if [[ $EMPTY_FILE -eq 1 ]]; then
echo "Nothing to do"
else
apt-get  install -y $packages
fi
Claudio Taccogna
fonte
0

A seguir, é apresentada uma lista de todos os pacotes relevantes que não estão instalados:

dpkg -l $boostlibnames 2>&1 | awk '{if (/^D|^\||^\+/) {next} else if(/^dpkg-query:/) { print $6} else if(!/^[hi]i/) {print $2}}' 

Isso pula dpkg -las linhas do cabeçalho e, em seguida, imprime as linhas em que o dpkg-query reclama sobre um pacote desconhecido, e as linhas que não começam com hiou ii(Hold Inst ou Install Inst).

Normalmente, eu faria algo como awk 'NR<=5 {next} ; ...'ou sed -e '1,5d'para se livrar das dpkg -llinhas de cabeçalho, mas, neste caso, estamos redirecionando o stderr para o stdout, a fim de capturar reclamações dpkg-querye também dpkg -las saídas, para que não possamos simplesmente excluir a primeira 5 linhas.

Isso mostrará os pacotes nunca instalados, removidos, eliminados ou onde a instalação falhou / foi parcialmente concluída devido a erro.

cas
fonte
0

Eu uso o seguinte código no meu trabalho chamado Easy Bash , que ajuda a instalar os pacotes mais populares rapidamente nos servidores Ubuntu. Este código irá verificar os pacotes listados instalados ou não.

#!/usr/bin/env bash

packages=("curl" "gnupg2" "ca-certificates" "lsb-release")

for pkg in ${packages[@]}; do

    is_pkg_installed=$(dpkg-query -W --showformat='${Status}\n' ${pkg} | grep "install ok installed")

    if [ "${is_pkg_installed}" == "install ok installed" ]; then
        echo ${pkg} is installed.
    fi
done

Resultado:

insira a descrição da imagem aqui

Terry Lin
fonte
Bem-vindo ao site e obrigado por sua contribuição. Ainda assim, evite postar capturas de tela da saída do console e copie e cole com a formatação adequada ...
AdminBee
-1
#to check package is installed or not without distribution dependency
#!/bin/bash
read -p "Package Name: " pkg
which $pkg > /dev/null 2>&1
if [ $? == 0 ]
then
echo "$pkg is already installed. "
else
read -p "$pkg is not installed. Answer yes/no if want installation_ " request
if  [ $request == "yes" ]
then
yum install $pkg
fi
fi
linux.cnf
fonte
A questão não era verificar se um único pacote já está instalado.
guntbert