Я работаю над системой Ubuntu, и в настоящее время это то, что я делаю:
if ! which command > /dev/null; then
echo -e "Command not found! Install? (y/n) \c"
read
if "$REPLY" = "y"; then
sudo apt-get install command
fi
fi
Это то, что большинство людей будет делать? Или есть более элегантное решение?
command -v <command>
; неwhich <command>
. Также см. Проверка, существует ли программа из скрипта Bash .Ответы:
Чтобы проверить,
packagename
был ли установлен, введите:Вы также можете использовать
dpkg-query
тот, который имеет более точный вывод для ваших целей, а также принимает групповые символы.Чтобы узнать, какой пакет принадлежит
command
, попробуйте:Для получения дополнительной информации см. Статью Узнайте, установлен ли пакет в Linux и шпаргалке dpkg .
источник
if
использовать. Я также ищуif
использование.dpkg -s
возвращаю 1 для отсутствующих пакетов и 0 в противном случае, как и должно быть. Чем отличались предыдущие (или последние) версии?dpkg -s
возвращает ноль, если пакет был установлен, а затем удален - в этом случае онStatus: deinstall ok config-files
или похож, так что все в порядке - так что для меня это не безопасный тест.dpkg-query -l
в этом случае, похоже, тоже не возвращает полезного результата.Чтобы быть немного более явным, вот немного bash-скрипта, который проверяет пакет и устанавливает его при необходимости. Конечно, вы можете сделать другие вещи, обнаружив, что пакет отсутствует, например, просто выйдя с кодом ошибки.
Если скрипт выполняется в графическом интерфейсе (например, это скрипт Nautilus), вы, вероятно, захотите заменить вызов sudo на вызов gksudo.
источник
--force-yes
кажется плохой идеей. Со страницы man: «Это опасный параметр, который заставляет apt-get продолжать работу без запроса, если он делает что-то потенциально опасное. Его не следует использовать, за исключением очень особых ситуаций. Использование --force-yes может потенциально разрушить вашу систему !» Использование его в сценарии делает его еще хуже.Эта однострочная строка возвращает 1 (установлено) или 0 (не установлено) для пакета 'nano'.
даже если пакет не существует / недоступен.
Пример ниже устанавливает пакет 'nano', если он не установлен ..
источник
dpkg-query -W -f='${Status}' MYPACKAGE | grep -q -P '^install ok installed$'; echo $?
grep -P
такое простое регулярное выражение.if ! dpkg-query -W -f='${Status}' nano | grep "ok installed"; then apt install nano; fi
- Не нужно использоватьgrep -c
, просто используйте статус выходаgrep
dpkg -s
программное использование с автоматической установкойМне нравится,
dpkg -s
как он выходит со статусом,1
если какой-либо из пакетов не установлен, что позволяет легко автоматизировать:man dpkg
К сожалению, не документирует статус выхода, но я думаю, что на него следует полагаться в достаточной степени:Стоит отметить, что работает:
не обязательно сразу удаляет все файлы для некоторых пакетов (но делает для других, не уверен почему?), а просто помечает пакет для удаления.
В этом состоянии пакет, по-видимому, все еще пригоден для использования, и поскольку его файлы все еще присутствуют, но он помечен для удаления позже.
Например, если вы запустите:
затем:
первые два
echo $?
выхода0
, только третий выводит1
вывод для первого
dpkg -s certbot
содержит:в то время как второй говорит:
и он исчезает только после чистки:
файл
/etc/logrotate.d/certbot
все еще присутствует в системе послеapt remove
, но не после--purge
.Тем не менее, файл
/usr/lib/python3/dist-packages/certbot/reporter.py
все еще присутствует даже после--purge
.Я не понимаю, почему, но с
hello
пакетом второйdpkg
послеapt remove
показывает, что он уже был удален без--purge
:Документация также очень неясна, например:
не удаляется,
certbot
когда он помечен какdeinstall
, хотя,man apt-get
кажется, указывает, что:Смотрите также:
Проверено на Ubuntu 19.10.
apt
Пакет PythonВ
apt
Ubuntu 18.04 есть предустановленный пакет Python 3, который предоставляет интерфейс Python apt!Сценарий, который проверяет, установлен ли пакет, и устанавливает его, если его нет, по адресу: Как установить пакет с помощью API python-apt
Вот копия для справки:
Проверьте, находится ли исполняемый файл
PATH
вместоСмотрите: Как я могу проверить, существует ли программа из Bash-скрипта?
источник
sudo apt install hello; dpkg -s hello; echo $?; sudo apt remove hello; dpkg -s hello; echo $?
. Можете ли вы предоставить более подробную информацию?Я предлагаю это обновление, так как Ubuntu добавил свой «Личный архив пакетов» (PPA), как только на этот вопрос был дан ответ, и пакеты PPA имеют другой результат.
Собственный пакет репозитория Debian не установлен:
Пакет PPA зарегистрирован на хосте и установлен:
Пакет PPA зарегистрирован на хосте, но не установлен:
Также размещено по адресу : /superuser/427318/test-if-a-package-is-installed-in-apt/427898
источник
UpAndAdam написал:
По моему опыту вы можете положиться на коды выхода dkpg.
Код возврата dpkg -s равен 0, если пакет установлен, и 1, если нет, поэтому самое простое решение, которое я нашел, было:
У меня отлично работает ...
источник
apt-get remove <package>
, какdpkg -s <package>
все еще возвращает 0, хотя пакетdeinstalled
Кажется, это работает очень хорошо.
0
если не установлен, либо какой-либо номер,> 0
если установлен.источник
grep | wc -l
это антипаттерн. Чтобы проверить, если что-то существует, вы хотите простоgrep -q
. Для фактического подсчета вхождений (что редко бывает полезно в подобных ситуациях) используйтеgrep -c
.dpkg -s zip | grep -c "Package: zip"
? (с использованием почтового индекса в качестве образца пакета)grep -q 'Package: zip'
вернуть код завершения, который указывает, был ли найден результат без печати чего-либо.Я остановился на одном, основываясь на ответе Нулти :
По сути, сообщение об ошибке от
dpkg --get-selections
намного легче разобрать, чем большинство других, потому что оно не включает такие состояния, как «деинсталляция». Он также может проверять несколько пакетов одновременно, чего нельзя сделать только с помощью кодов ошибок.Объяснение / пример:
Поэтому grep удаляет установленные пакеты из списка, а awk извлекает имена пакетов из сообщения об ошибке, в результате
MISSING='python3-venv python3-dev jq'
чего их можно легко вставить в команду установки.Я не выпускаю вслепую,
apt-get install $PACKAGES
потому что, как упоминалось в комментариях, это может неожиданно обновить пакеты, которые вы не планировали; не очень хорошая идея для автоматизированных процессов, которые, как ожидается, будут стабильными.источник
[[ ! -z $MISSING ]] && sudo apt-get install $MISSING
Я обнаружил, что все приведенные выше решения могут привести к ложному срабатыванию, если пакет установлен, а затем удален, но установочный пакет остается в системе.
Для репликации: Установить пакет
apt-get install curl
Удалить пакет
apt-get remove curl
Теперь проверьте приведенные выше ответы.
Следующая команда, кажется, решает это условие:
dpkg-query -W -f='${Status}\n' curl | head -n1 | awk '{print $3;}' | grep -q '^installed$'
Это приведет к окончательной установке или неустановке
источник
config-files
так что я думаю, что окончательный вариант| grep -q "installed"
действительно необходим для получения функционального кода выхода.| grep -q '^installed$'
Кажется, что в настоящее время
apt-get
есть опция,--no-upgrade
которая делает то, что хочет ОП:Manpage от https://linux.die.net/man/8/apt-get
Поэтому вы можете использовать
и
package
будет установлен, только если это не так.источник
источник
command -v <command>
; неwhich <command>
. Также см. Проверка, существует ли программа из скрипта Bash .Это сделает это.
apt-get install
идемпотент.источник
apt-get install
пакета on нежелательно, когда пакет уже установлен, хотя сама команда является идемпотентной. В моем случае я устанавливаю пакет в удаленной системе с необработанным модулем Ansible, который будет сообщать об изменении системы каждый раз, когда я буду работатьapt-get install
без разбора. Условное решение этой проблемы.Использование:
Если он не установлен, он покажет:
Иначе это покажет:
источник
Эта функция уже существует в Ubuntu и Debian в
command-not-found
пакете.источник
command-not-found
это интерактивный помощник, а не инструмент, который гарантирует, что у вас есть зависимости, которые вы хотите. Конечно, правильным способом объявления зависимостей является упаковка вашего программного обеспечения в пакет Debian и заполнениеDepends:
декларации в пакете.debian/control
правильно файле .кажется, самый простой способ сделать это вне dpkg и старых инструментов apt- *
источник
источник
command -v <command>
; неwhich <command>
. Также см. Проверка, существует ли программа из скрипта Bash .У меня было подобное требование при запуске теста локально, а не в докере. По сути, я хотел установить только те файлы .deb, которые не были установлены.
Я думаю, что единственная проблема, которую я вижу, заключается в том, что он не проверяет номер версии пакета, поэтому, если файл .deb является более новой версией, это не перезапишет установленный в данный момент пакет.
источник
Для Ubuntu apt предоставляет достаточно приличный способ сделать это. Ниже приведен пример для Google Chrome:
apt -qq list google-chrome-stable 2>/dev/null | grep -qE "(installed|upgradeable)" || apt-get install google-chrome-stable
Я перенаправляю вывод ошибок на ноль, потому что apt предупреждает против использования своего "нестабильного кли". Я подозреваю, что список пакетов стабилен, поэтому я думаю, что можно выбросить это предупреждение. -Qq делает супер тихий.
источник
Эта команда самая запоминающаяся:
Если он установлен, он печатает:
В противном случае он печатает
Это было проверено на Ubuntu 12.04.1 (Precise Pangolin).
источник
dpkg --get-selections <package-name>
не устанавливает код выхода, отличный от нуля, когда пакет не найден.Многое было сказано, но для меня самый простой способ это:
источник
В Баше:
Обратите внимание, что в PKG может быть строка с несколькими пакетами.
источник
Я использую следующий способ:
источник