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.


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.)


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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.