dpkg -s
програмне використання з автоматичною установкою
Мені подобається dpkg -s
, що він закінчується статусом, 1
якщо жоден із пакунків не встановлений, що спрощує автоматизацію:
pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
sudo apt-get install $pkgs
fi
man dpkg
на жаль, не документально підтверджує статус виходу, але я думаю, що на нього слід покладатися досить безпечно:
-s, --status package-name...
Report status of specified package.
Варто зазначити одне, що працює:
sudo apt remove <package-name>
не обов’язково видаляти всі файли відразу для деяких пакунків (але це стосується інших, не знаю, чому?), а просто позначає пакет для видалення.
У такому стані пакет, як видається, є корисним і тому, що його файли все ще є, але він буде позначений для видалення пізніше.
Наприклад, якщо ви запускаєте:
pkg=certbot
sudo apt install -y "$pkg"
dpkg -s "$pkg"
echo $?
sudo apt remove -y "$pkg"
dpkg -s "$pkg"
echo $?
ls -l /usr/lib/python3/dist-packages/certbot/reporter.py
sudo apt remove --purge certbot
dpkg -s "$pkg"
echo $?
ls -l /usr/lib/python3/dist-packages/certbot/reporter.py
тоді:
перші два echo $?
вихідні дані 0
, лише третій1
вихід для першого dpkg -s certbot
містить:
Status: deinstall ok installed
а другий говорить:
Status: deinstall ok config-files
і він зникає лише після очищення:
dpkg-query: package 'certbot' is not installed and no information is available
файл /etc/logrotate.d/certbot
все ще присутній в системі після apt remove
, але не після --purge
.
Однак файл /usr/lib/python3/dist-packages/certbot/reporter.py
все ще присутній навіть після --purge
.
Я не розумію чому, але з hello
пакетом другий dpkg
після apt remove
показує, що він вже видалений без --purge
:
dpkg-query: package 'hello' is not installed and no information is available
Документація також дуже неясна, наприклад:
sudo apt dselect-upgrade
не видаляв, certbot
коли це було позначено як deinstall
, хоча, man apt-get
здається, вказує на те, що:
dselect-upgrade
використовується спільно з традиційною передньою частиною упаковки Debian, dselect (1). dselect-upgrade слідкує за змінами, внесеними dselect (1) у поле Status для доступних пакетів, та виконує дії, необхідні для усвідомлення цього стану (наприклад, видалення старих та встановлення нових пакетів).
Дивитися також:
Тестовано на Ubuntu 19.10.
apt
Пакет Python
Існує попередньо встановлений пакет Python 3, який називається apt
Ubuntu 18.04, який відкриває інтерфейс Python apt!
Сценарій, який перевіряє, чи встановлено пакунок, і встановлює його, якщо його немає, можна побачити на: Як встановити пакет за допомогою API python-apt
Ось копія для довідки:
#!/usr/bin/env python
# aptinstall.py
import apt
import sys
pkg_name = "libjs-yui-doc"
cache = apt.cache.Cache()
cache.update()
cache.open()
pkg = cache[pkg_name]
if pkg.is_installed:
print "{pkg_name} already installed".format(pkg_name=pkg_name)
else:
pkg.mark_install()
try:
cache.commit()
except Exception, arg:
print >> sys.stderr, "Sorry, package installation failed [{err}]".format(err=str(arg))
Перевірте, чи PATH
замість цього виконується виконуваний файл
Див.: Як я можу перевірити, чи існує програма зі сценарію Bash?