Cara memeriksa dari bash jika paket ada di Debian

12

Saya ingin menulis skrip instalasi bash, di mana saya ingin menginstal server MySQL.

Di Linux Mint saya mengikuti kode:

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

tapi saya menginstal Debian 8 yang baru dan tidak ada mysql-server- malah ada mariadb.

Bagaimana saya bisa mengetahui jika ada paket?

Saya hanya tahu bahwa ada dpkg -syang harus memberi tahu apakah suatu paket diinstal.

Dusan Plavak
sumber
3
--force-yesmenonaktifkan semua keamanan, sehingga Anda benar-benar dapat merusak sistem Anda ke titik tidak ada perbaikan. Juga: --force-yesmenimpa (menonaktifkan) -y. di mana yang terakhir bisa menjadi pilihan pilihan: Bentuk panjang -yadalah --assume-yes, dan itulah yang dilakukannya; Mengatakan ya sampai itu bisa menjadi sangat jelek, dengan mempertaruhkan kekacauan di antara elemen-elemen inti, fundamental, dll. --force
Mengesampingkan
Tambahan: Anda mungkin tertarik pada --simulateopsi untuk apt-get, melakukan --dry-run, untuk berjaga
erch
1
hanya untuk mengklarifikasi: Anda ingin mengetahui apakah suatu paket ada di dalam salah satu repositori yang didefinisikan /etc/apt/sources.list, kan?
wullxz
Perhatikan bahwa ada sebenarnya adalah paket mysql-server di Debian 8, bersama MariaDB: packages.debian.org/jessie/mysql-server
Dan Getz

Jawaban:

13

(di bawah ini dari Ubuntu, tetapi teknik yang sama juga bekerja pada 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
...

Jika paket ada, informasi akan ditampilkan. Jika tidak, Anda akan melihat sesuatu seperti:

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

Selain itu, kode keluar tidak apt-cacheakan nol jika tidak ada paket yang cocok ditemukan.

Catatan tambahan: Jika Anda menggunakan apt-cache show packagepaket mana yang virtual (yang tidak ada, tetapi, misalnya, dirujuk oleh paket lain), Anda akan mendapatkan:

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

Ini exit codenol (yang agak menyesatkan menurut saya.)

EEAA
sumber
3
hanya untuk menyelesaikan jawaban ini: Anda juga dapat mencari repositori didefinisikan dari sources.listdengan perintah ini: apt-cache search *searchstring*. Perintah itu juga akan mencari deskripsi paket dan dapat membantu Anda menemukan paket di mana Anda tidak tahu nama paket yang tepat.
wullxz
1
@wullxz, hanya apt-cache search ...mengembalikan segala jenis kecocokan dan aplikasi. mengembalikan 0 bahkan jika tidak ada yang ditemukan, yang tidak praktis dalam skrip bash.
Alexis Wilke
4

Saya akan menggunakan dpkg -l mysql-server &> /dev/null && echo "mysql-server is installed".

Ini akan memeriksa apakah mysql-serverpaket diinstal dan jika demikian, ia mencetak fakta ini ke layar. Solusi yang lebih canggih adalah, dalam bash (belum diuji):

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

Jadi seseorang dapat melakukannya dalam sebuah skrip:

if ! package_exists mysql-server ; then
    echo Please install mysql-server!"
fi
Gergely Polonkai
sumber
5
Saya pikir dia ingin tahu apakah paket itu ada sama sekali dan tidak jika sudah diinstal pada mesin lokal ...
wullxz
0

Dalam satu garis:

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

keluar dengan 0 jika ada, 1 jika tidak.

Bonus: pemeriksaan efisien untuk beberapa paket, tercantum dalam file "packages_we_want", satu per baris, disortir dengan sort:

apt-cache --no-generate pkgnames | sort | comm -13 - packages_we_wantdaftar semua paket yang Anda inginkan, tetapi tidak ada di repositori.

apt-cache --no-generate pkgnames | sort | comm -12 - packages_we_want daftar semua paket yang Anda inginkan dan ada di repositori.

Shnatsel
sumber