Como verificar no bash se o pacote existe no Debian


12

Gostaria de escrever um script de instalação, onde gostaria de instalar o servidor MySQL.

No Linux Mint, eu segui o código:

apt-get -y --force-yes install mysql-server-5.6

mas eu instalei o novo Debian 8 e não existe mysql-server- em vez disso existe mariadb.

Como posso descobrir se o pacote existe?

Eu só sei que existe o dpkg -sque deve dizer se um pacote está instalado.


3
--force-yesdesativa toda a segurança, para que você realmente possa danificar seu sistema a ponto de não ser reparado. Além disso: --force-yessubstitui (desativa) -y. onde o último poderia ser a opção de escolha: uma forma longa de -yé --assume-yese é isso que ele faz; Dizer sim até que ele poderia ficar muito feio, com o risco de estragos entre elementos centrais, fundamentos, etc. --forcesegurança sobrepõe breaks (aprendi isso da maneira mais difícil)
erch

Adenda: Você pode estar interessado na --simulateopção de apt-get, para fazer um --dry-run, apenas no caso
erch

1
apenas para esclarecer: você deseja descobrir se um pacote está em algum dos repositórios definidos /etc/apt/sources.list, certo?
wullxz

Note-se que há, na verdade, é um pacote mysql-server no Debian 8, ao lado de MariaDB: packages.debian.org/jessie/mysql-server
Dan Getz

Respostas:


13

(o abaixo é do Ubuntu, mas a mesma técnica obviamente também funciona no Debian)

$ apt-cache show screen
Package: screen
Priority: optional
Section: misc
Installed-Size: 950
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Axel Beckert <abe@debian.org>
Architecture: amd64
Version: 4.1.0~20120320gitdb59704-9
Depends: libc6 (>= 2.15), libpam0g (>= 0.99.7.1), libtinfo5
Suggests: iselect (>= 1.4.0-1) | screenie | byobu
Filename: pool/main/s/screen/screen_4.1.0~20120320gitdb59704-9_amd64.deb
Size: 645730
...

Se o pacote existir, as informações serão exibidas. Caso contrário, você verá algo como:

$ apt-cache show foobar
N: Unable to locate package foobar
E: No packages found

Além disso, o código de saída apt-cacheserá diferente de zero se nenhum pacote correspondente for encontrado.

Nota adicional: se você estiver usando apt-cache show packageonde pacote é virtual (um que não existe, mas é, por exemplo, referenciado por outros pacotes), você obtém:

N: Can't select versions from package 'package' as it is purely virtual
N: No packages found

O valor exit codeé zero (o que é um pouco enganador na minha opinião.)


3
apenas para completar esta resposta: você também pode procurar os repositórios definidos a partir do sources.listcom este comando: apt-cache search *searchstring*. Esse comando também pesquisará a descrição dos pacotes e poderá ajudá-lo a encontrar pacotes onde você não sabe o nome exato do pacote.
Wullxz

1
@wullxz, apenas apt-cache search ...retorna qualquer tipo de correspondência e o aplicativo. retorna 0 mesmo que nada seja encontrado, o que não é prático em um script bash.
Alexis Wilke

4

Eu usaria dpkg -l mysql-server &> /dev/null && echo "mysql-server is installed".

Ele verificará se o mysql-serverpacote está instalado e, se estiver, imprime esse fato na tela. Uma solução mais sofisticada seria, no bash (não testado):

function package_exists() {
    return dpkg -l "$1" &> /dev/null
}

Então, pode-se fazer em um script:

if ! package_exists mysql-server ; then
    echo Please install mysql-server!"
fi

5
Eu acho que ele quer saber se o pacote existe em tudo e não se ele já está instalado na máquina local ...
wullxz

0

Em uma linha:

apt-cache pkgnames | grep -q "\<$your_package_name\>"

sai com 0 se estiver presente, 1 se não estiver.

Bônus: verificação eficiente de vários pacotes, listados no arquivo "packages_we_want", um por linha, classificado com sort:

apt-cache --no-generate pkgnames | sort | comm -13 - packages_we_wantlista todos os pacotes que você deseja, mas não existem nos repositórios.

apt-cache --no-generate pkgnames | sort | comm -12 - packages_we_want lista todos os pacotes que você deseja e existe nos repositórios.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.