Як перевірити з bash, чи існує пакет у Debian


12

Я хотів би написати скрипт встановлення bash, де я хотів би встановити MySQL-сервер.

У Linux Mint я дотримувався коду:

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

але я встановив новий Debian 8 і немає mysql-server- натомість є mariadb.

Як я можу дізнатися, чи існує пакет?

Я просто знаю, що є те, dpkg -sщо повинно сказати, чи встановлений пакет.


3
--force-yesдеактивує всю безпеку, так що ви дійсно можете зламати систему до точки ремонту. Також: --force-yesпереосмислює (деактивує) -y. де останній може бути варіантом вибору: довга форма -yє --assume-yes, і це робиться; Сказати так , поки він не міг отримати дійсно потворним, з ризиком спустошення серед основних елементів, основ, і т.д. --forceбезпеки пересилює брейки (дізнався це важкий шлях)
erch

Додаток: Можливо, вас зацікавить --simulateваріант для того apt-get, щоб зробити --dry-run, про всяк випадок
erch

1
просто для уточнення: ви хочете з’ясувати, чи є пакет у будь-якому із сховищ, визначених у /etc/apt/sources.list, правда?
wullxz

Зверніть увагу , що на насправді являє собою пакет MySQL-сервера в Debian 8, поряд з MariaDB: packages.debian.org/jessie/mysql-server
Dan Getz

Відповіді:


13

(нижче від Ubuntu, але ця ж техніка, очевидно, працює і на 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
...

Якщо пакет існує, інформація відображатиметься. Якщо ні, ви побачите щось на кшталт:

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

Крім того, вихідний код apt-cacheбуде не нульовим, якщо не знайдено відповідних пакетів.

Додаткова примітка. Якщо ви використовуєте, apt-cache show packageде пакунок є віртуальним (той, який не існує, але, наприклад, на який посилаються інші пакети), ви отримаєте:

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

Це exit codeдорівнює нулю (що, на мою думку, трохи вводить в оману).


3
просто завершити цю відповідь: Ви можете також шукати певні репозиторії з sources.listцієї команди: apt-cache search *searchstring*. Ця команда також шукатиме опис пакетів і може допомогти вам знайти пакунки, де ви не знаєте точної назви пакета.
wullxz

1
@wullxz, лише apt-cache search ...повертає будь-які відповідники та додаток. повертає 0, навіть якщо нічого не знайдено, що не є практичним у сценарії bash.
Алексіс Вілке

4

Я б користувався dpkg -l mysql-server &> /dev/null && echo "mysql-server is installed".

Він перевірить, чи встановлений mysql-serverпакет, і якщо так, він виведе цей факт на екран. Більш складним рішенням може бути, в основному, (неперевірений):

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

Так можна зробити в сценарії:

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

5
Думаю, він хоче знати, чи існує пакет взагалі, а чи не він уже встановлений на локальній машині ...
wullxz

0

В однострої:

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

виходить з 0, якщо він присутній, 1 якщо ні.

Бонус: ефективна перевірка декількох пакетів, перелічених у файлі "пакети_we_want", один на рядок, відсортований за sort:

apt-cache --no-generate pkgnames | sort | comm -13 - packages_we_wantперелічує всі пакети, які ви хочете, але їх не існує у сховищах.

apt-cache --no-generate pkgnames | sort | comm -12 - packages_we_want перелічує всі пакети, які ви хочете і які існують у сховищах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.