Как проверить из 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

Обратите внимание, что на самом деле в Debian 8 есть пакет mysql-server, наряду с mariadb: packages.debian.org/jessie/mysql-server
Дэн Гетц,

Ответы:


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пакет и, если да, выведет этот факт на экран. Более сложное решение было бы в bash (не проверено):

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, если нет.

Бонус: эффективная проверка для нескольких пакетов, перечисленных в файле "packages_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.