Come verificare da bash se il pacchetto esiste in Debian


12

Vorrei scrivere uno script bash di installazione, dove vorrei installare il server MySQL.

Su Linux Mint avevo seguito il codice:

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

ma ho installato il nuovo Debian 8 e non c'è mysql-server- invece c'è mariadb.

Come posso sapere se esiste un pacchetto?

So solo che c'è dpkg -sche dovrebbe dire se un pacchetto è installato.


3
--force-yesdisattiva tutta la sicurezza, quindi potresti davvero rompere il tuo sistema fino al punto di non ripararlo. Inoltre: --force-yesignora (disattiva) -y. dove quest'ultima potrebbe essere l'opzione di scelta: una lunga forma di -yè --assume-yes, ed è quello che fa; Dire di sì fino a quando non potrebbe diventare davvero brutto, con il rischio di devastazione tra elementi fondamentali, fondamenti, ecc. --force
Scavalca la

Addendum: potresti essere interessato --simulateall'opzione per apt-get, per fare un --dry-run, per ogni evenienza
erch

1
solo per chiarire: vuoi scoprire se un pacchetto si trova in uno dei repository definiti in /etc/apt/sources.list, giusto?
wullxz,

Si noti che in realtà esiste un pacchetto mysql-server in Debian 8, insieme a mariadb: packages.debian.org/jessie/mysql-server
Dan Getz,

Risposte:


13

(il seguito è di Ubuntu, ma la stessa tecnica ovviamente funziona anche su 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 il pacchetto esiste, verranno visualizzate le informazioni. In caso contrario, vedrai qualcosa di simile:

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

Inoltre, il codice di uscita apt-cachesarà diverso da zero se non viene trovato alcun pacchetto corrispondente.

Nota aggiuntiva: se stai utilizzando un apt-cache show packagepacchetto virtuale (uno che non esiste, ma ad esempio a cui fanno riferimento altri pacchetti), otterrai:

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

Il exit codedi questo è zero (il che è un po 'fuorviante secondo me.)


3
solo per completare questa risposta: è anche possibile cercare i repository definiti dal sources.listcon questo comando: apt-cache search *searchstring*. Tale comando cercherà anche la descrizione dei pacchetti e potrebbe aiutarti a trovare pacchetti in cui non conosci il nome esatto del pacchetto.
wullxz,

1
@wullxz, solo apt-cache search ...restituisce qualsiasi tipo di corrispondenza e l'app. restituisce 0 anche se non viene trovato nulla, il che non è pratico in uno script bash.
Alexis Wilke,

4

Vorrei usare dpkg -l mysql-server &> /dev/null && echo "mysql-server is installed".

Controllerà se il mysql-serverpacchetto è installato e, in tal caso, stampa questo fatto sullo schermo. Una soluzione più sofisticata sarebbe, in bash (non testato):

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

Quindi uno può fare in uno script:

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

5
Penso che voglia sapere se il pacchetto esiste affatto e non se è già installato sul computer locale ...
wullxz,

0

In una linea:

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

esce con 0 se è presente, 1 in caso contrario.

Bonus: controllo efficiente per più pacchetti, elencati nel file "pacchetti_we_want", uno per riga, ordinati con sort:

apt-cache --no-generate pkgnames | sort | comm -13 - packages_we_wantelenca tutti i pacchetti desiderati, ma non esistono nei repository.

apt-cache --no-generate pkgnames | sort | comm -12 - packages_we_want elenca tutti i pacchetti desiderati ed esistenti nei repository.

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.