패키지가 설치되어 있는지 확인하고 설치되어 있지 않으면 어떻게 해야 합니까?
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
이게 대부분의 사람들이 하는 일인가요?아니면 좀 더 우아한 해결책이 있을까요?
packagename
인스톨 .입력 :를 was 、 음 、 음 음 、 음 、 음 was was was was was was was 。
dpkg -s <packagename>
이 경우에도 하실 수 있습니다.dpkg-query
출력도 깔끔하고 와일드카드도 사용할 수 있습니다.
dpkg-query -l <packagename>
「」를 하고 있는 , 「」를 해 주세요.command
, ,::
dpkg -S `which <command>`
자세한 내용은 문서 "Find If package installed installed in Linux and dpkg cheat sheet" (패키지가 Linux 및 dpkg 치트시트)
조금 더 명확하게 하기 위해 패키지를 확인하고 필요에 따라 설치하는 Bash 스크립트를 소개합니다.물론 패키지가 누락된 경우 오류 코드를 사용하여 종료하는 등 다른 작업을 수행할 수 있습니다.
REQUIRED_PKG="some-package"
PKG_OK=$(dpkg-query -W --showformat='${Status}\n' $REQUIRED_PKG|grep "install ok installed")
echo Checking for $REQUIRED_PKG: $PKG_OK
if [ "" = "$PKG_OK" ]; then
echo "No $REQUIRED_PKG. Setting up $REQUIRED_PKG."
sudo apt-get --yes install $REQUIRED_PKG
fi
스크립트가 GUI 내에서 실행되는 경우(예를 들어 Nautilus 스크립트), 'sudo' 호출을 'gksudo' 호출로 대체할 수 있습니다.
이 원라이너는 '나노' 패키지에 대해 1(설치됨) 또는 0(설치되지 않음)을 반환합니다.
$(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed")
패키지가 존재하지 않거나 사용할 수 없는 경우에도 마찬가지입니다.
아래 예시는 '나노' 패키지가 설치되지 않은 경우 설치...
if [ $(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed") -eq 0 ];
then
apt-get install nano;
fi
dpkg-query --showformat='${db:Status-Status}'
, 출력 되어 「」, 「」, 「」, 「」, 「」, 「」를 사용하지 않고, .grep
:
pkg=hello
status="$(dpkg-query -W --showformat='${db:Status-Status}' "$pkg" 2>&1)"
if [ ! $? = 0 ] || [ ! "$status" = installed ]; then
sudo apt install $pkg
fi
$? = 0
는 패키지를 본 이 없고, 후, 가 삭제되면 합니다.hello
,dpkg-query
stderr stderr 이다.
dpkg-query: no packages found matching hello
하지 않고not-installed
. 。2>&1
는, 에러 메세지가 단말기에 송신되지 않게 되었을 때에도, 그 에러 메세지를 캡쳐 합니다.
여러 패키지의 경우:
pkgs='hello certbot'
install=false
for pkg in $pkgs; do
status="$(dpkg-query -W --showformat='${db:Status-Status}' "$pkg" 2>&1)"
if [ ! $? = 0 ] || [ ! "$status" = installed ]; then
install=true
break
fi
done
if "$install"; then
sudo apt install $pkgs
fi
할 수 있는 는, 「」, 「」에 .man dpkg-query
같이요.
n = Not-installed
c = Config-files
H = Half-installed
U = Unpacked
F = Half-configured
W = Triggers-awaiting
t = Triggers-pending
i = Installed
단일 문자 버전은 다음에서 구할 수 있습니다.db:Status-Abbrev
상태가 나타나기 합니다.
되지 않은 자본화되지 않은 상태)에 할 수 만큼 할 수 있다고 합니다.Config-files
»config-files
을 사용하다
dpkg -s
status(종료 상태)
안타깝게도 대부분의 사용자가 원하는 기능을 제공하지 않습니다.
pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
sudo apt-get install $pkgs
fi
" " " " " )의 경우, " " 입니다.certbot
「 」:
sudo apt install certbot
sudo apt remove certbot
certbot
config-files
즉, 설정 파일이 머신에 남아 있는 것을 의미합니다.그리고 그 상태에서dpkg -s
반환됩니다.0
패키지의 메타데이터는, 이러한 설정 파일을 보다 효율적으로 처리할 수 있도록, 아직 보관 유지되고 있기 때문입니다.
만들기 dpkg -s
--purge
다음 중 하나:
sudo apt remove --purge certbot
''로 이동합니다'not-installed
/dpkg-query: no packages found matching
.
특정 패키지만이 설정 파일을 남기는 것에 주의해 주세요.음 package like like like like like like like와 같은 간단한 hello
installed
로로 합니다.not-installed
없이--purge
.
Ubuntu 20.10에서 테스트.
Python 이 python apt
3에는 Python 3 패키지가 되어 .apt
Ubuntu 18.04 Python apt apt!
패키지가 설치되어 있는지 확인하고 설치되어 있지 않은 경우 설치하는 스크립트: python-apt API를 사용하여 패키지를 설치하는 방법
다음은 참조용 사본입니다.
#!/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 스크립트에서 프로그램이 존재하는지 확인하려면 어떻게 해야 합니까?
「 」를 참조해 주세요.
- https://askubuntu.com/questions/165951/dpkg-get-selections-shows-packages-marked-deinstall
- https://askubuntu.com/questions/423355/how-do-i-check-if-a-package-is-installed-on-my-server
Ubuntu는 PPA(Personal Package Archive)를 추가했으며 PPA 패키지는 다른 결과를 가져옵니다.
네이티브 Debian 저장소 패키지가 설치되지 않았습니다.
~$ dpkg-query -l apache-perl ~$ echo $? 1
호스트에 등록되고 설치된 PPA 패키지:
~$ dpkg-query -l libreoffice ~$ echo $? 0
호스트에 등록되었지만 설치되지 않은 PPA 패키지:
~$ dpkg-query -l domy-ce ~$ echo $? 0 ~$ sudo apt-get remove domy-ce [sudo] password for user: Reading package lists... Done Building dependency tree Reading state information... Done Package domy-ce is not installed, so not removed 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
게시일: 패키지가 APT에 설치되어 있는지 테스트합니다.
UpAndAdam은 다음과 같이 썼다.
단, 여기서 단순히 반환 코드를 스크립팅에 의존할 수는 없습니다.
내 경험상 dkpg의 종료 코드를 신뢰할 수 있습니다.
dpkg -s의 반환 코드는 패키지가 설치되어 있으면 0, 설치되어 있지 않으면 1입니다.따라서 제가 찾은 가장 간단한 방법은 다음과 같습니다.
dpkg -s <pkg-name> 2>/dev/null >/dev/null || sudo apt-get -y install <pkg-name>
나한테는 잘 먹히는데...
놀티의 대답에 근거해 하나 정했어
MISSING=$(dpkg --get-selections $PACKAGES 2>&1 | grep -v 'install$' | awk '{ print $6 }')
# Optional check here to skip bothering with apt-get if $MISSING is empty
sudo apt-get install $MISSING
입니다.dpkg --get-selections
는, 「deinstall」등의 않기 다른 것입니다.또, 에러 코드만으로는 할 수 없는 복수의 패키지를 동시에 체크할 수 있습니다.
설명/예:
$ dpkg --get-selections python3-venv python3-dev screen build-essential jq
dpkg: no packages found matching python3-venv
dpkg: no packages found matching python3-dev
screen install
build-essential install
dpkg: no packages found matching jq
따라서 설치된 패키지가 목록에서 삭제되고 패키지 이름이 오류 메시지에서 삭제되므로MISSING='python3-venv python3-dev jq'
인스톨
는 무작정 an an an an an를 발행하는 apt-get install $PACKAGES
코멘트에 기재되어 있는 바와 같이, 이것은 예정외의 패키지를 예기치 않게 업그레이드 할 가능성이 있기 때문에, 안정성이 기대되는 자동 프로세스에는 그다지 좋은 생각이 아닙니다.
이거 꽤 잘 되는 것 같은데.
$ sudo dpkg-query -l | grep <some_package_name> | wc -l
- " " " 를하거나" 를 반환한다.
0
되어 않은 경우, 의 번호 「」가 인스톨 되어 있지 않은 ,> 0
★★★★★★★★★★★★★★★★★★★★★★★★★★★
요즘 들어서는apt-get
이 --no-upgrade
OPMMMMD의 경우도 있습니다.
--no-upgrade
이치노install과 경우 .install 패키지는 no-upgrade로 되지 않습니다.
https://linux.die.net/man/8/apt-get의 Manpage
그 때문에, 다음과 같이 사용할 수 있습니다.
apt-get install --no-upgrade package
★★★★★★★★★★★★★★★★★」package
인스톨 되지 않는 경우에만 인스톨 됩니다.
Chris의 답변에 영감을 받아:
#! /bin/bash
installed() {
return $(dpkg-query -W -f '${Status}\n' "${1}" 2>&1|awk '/ok installed/{print 0;exit}{print 1}')
}
pkgs=(libgl1-mesa-dev xorg-dev vulkan-tools libvulkan-dev vulkan-validationlayers-dev spirv-tools)
missing_pkgs=""
for pkg in ${pkgs[@]}; do
if ! $(installed $pkg) ; then
missing_pkgs+=" $pkg"
fi
done
if [ ! -z "$missing_pkgs" ]; then
cmd="sudo apt install -y $missing_pkgs"
echo $cmd
fi
이거면 될 거야. apt-get install
의미합합니니다
sudo apt-get install --no-upgrade command
이전 답변의 모든 솔루션은 패키지를 설치한 후 삭제해도 시스템에 설치 패키지가 남아 있을 경우 잘못된 긍정이 발생할 수 있습니다.
복제 방법:
''」를 인스톨 합니다.apt-get install curl
" " " 를 합니다.apt-get remove curl
이제 앞의 답을 테스트해 보겠습니다.
다음 명령어로 이 상태를 해결할 수 있을 것 같습니다.
dpkg-query -W -f='${Status}\n' curl | head -n1 | awk '{print $3;}' | grep -q '^installed$'
최종 설치 또는 미설치 상태가 됩니다.
$name="rsync"
[ `which $name` ] $$ echo "$name : installed" || sudo apt-get install -y $name
용도:
apt-cache policy <package_name>
인스톨 되어 있지 않은 경우는, 다음과 같이 표시됩니다.
Installed: none
그렇지 않으면 다음과 같이 표시됩니다.
Installed: version
이 기능은 Ubuntu 및 Debian 패키지에 이미 있습니다.
awk 만을 사용하여 0 이 출력됩니다.그렇지 않으면 1 이 출력됩니다.
dpkg-query -W -f '${Status}\n' 'PKG' 2>&1|awk '/ok installed/{print 0;exit}{print 1}'
또는 반대로 1이 설치된 것을 의미하고, 그렇지 않으면 0을 의미할 경우 다음을 수행합니다.
dpkg-query -W -f '${Status}\n' 'PKG' 2>&1|awk '/ok installed/{print 1;exit}{print 0}'
** PKG를 패키지 이름으로 대체
편의 기능:
installed() {
return $(dpkg-query -W -f '${Status}\n' "${1}" 2>&1|awk '/ok installed/{print 0;exit}{print 1}')
}
# usage:
installed gcc && echo Yes || echo No
#or
if installed gcc; then
echo yes
else
echo no
fi
Ubuntu의 경우apt
꽤 괜찮은 방법을 제공합니다.구글 크롬
apt -qq list google-chrome-stable 2>/dev/null | grep -qE "(installed|upgradeable)" || apt-get install google-chrome-stable
왜냐하면, 「null」이기 때문입니다.apt
cli를 사용하다리스트 패키지는 안정되어 있을 것 같기 때문에, 이 경고는 버려도 좋다고 생각합니다. 조용해집니다qq를 사용하면 매우 .
which <command>
if [ $? == 1 ]; then
<pkg-manager> -y install <command>
fi
이 명령어가 가장 기억에 남습니다.
dpkg --get-selections <package-name>
인스톨 되어 있는 경우는, 다음과 같이 인쇄합니다.
<block-name> 설치
그렇지 않으면 인쇄됩니다.
일치하는 <package-name> 패키지를 찾을 수 없습니다.
이것은 Ubuntu 12.04.1(Precision Pangolin)에서 테스트되었습니다.
apt list [packagename]
dpkg 및 오래된 apt-* 툴 이외의 가장 간단한 방법인 것 같습니다.
도커가 아닌 로컬에서 테스트를 실행할 때도 비슷한 요건이 있었습니다.기본적으로는 .deb 파일이 아직 설치되어 있지 않은 경우만 설치하려고 했습니다.
# If there are .deb files in the folder, then install them
if [ `ls -1 *.deb 2> /dev/null | wc -l` -gt 0 ]; then
for file in *.deb; do
# Only install if not already installed (non-zero exit code)
dpkg -I ${file} | grep Package: | sed -r 's/ Package:\s+(.*)/\1/g' | xargs dpkg -s
if [ $? != 0 ]; then
dpkg -i ${file}
fi;
done;
else
err "No .deb files found in '$PWD'"
fi
패키지의 버전 번호를 확인하지 않기 때문에 .deb 파일이 새로운 버전인지 아닌지가 문제인 것 같습니다.그러면 현재 설치된 패키지는 덮어쓰지 않습니다.
좀 더 우아한 네 것을 바탕으로 한 것 같아.그냥 심심해서.
#!/bin/bash
FOUND=("\033[38;5;10m")
NOTFOUND=("\033[38;5;9m")
PKG="${@:1}"
command ${PKG} &>/dev/null
if [[ $? != 0 ]]; then
echo -e "${NOTFOUND}[!] ${PKG} not found [!]"
echo -e "${NOTFOUND}[!] Would you like to install ${PKG} now ? [!]"
read -p "[Y/N] >$ " ANSWER
if [[ ${ANSWER} == [yY] || ${ANSWER} == [yY][eE][sS] ]]; then
if grep -q "bian" /etc/os-release; then
sudo apt-get install ${PKG}
elif grep -q "arch" /etc/os-release; then
if [[ -f /bin/yay ]] || [[ -f /bin/yaourt ]]; then
yaourt -S ${PKG} 2>./err || yay -S ${PKG} 2>./err
else
sudo pacman -S ${PKG}
fi
elif grep -q "fedora" /etc/os-release; then
sudo dnf install ${PKG}
else
echo -e "${NOTFOUND}[!] This script couldn't detect your package manager [!]"
echo -e "${NOTFOUND}[!] Manually install it [!]"
fi
elif [[ ${ANSWER} == [nN] || ${ANSWER} == [nN][oO] ]]; then
echo -e "${NOTFOUND}[!] Exiting [!]"
fi
else
echo -e "${FOUND}[+] ${PKG} found [+]"
fi
다음과 같은 방법으로 사용할 것을 제안하는 답변입니다.
dpkg-query --showformat '${db:Status-Status}\n' --show $package | grep -q '^installed$'
dpkg-query --showformat '${Status}\n' --show $package | grep -q '^install ok installed$'
정답입니다.
, 패키지가 dpkg-dev
패키지가 인스톨 되어 있는지 아닌지를 확인하는 것 외에, 다음의 조작도 실시할 수 있습니다.
- 패키지가 특정 버전에 설치되어 있는지 알고 싶다
- 특정 아키텍처의 패키지를 갖고 싶다
- 가상 패키지가 제공되었는지 확인하려고 합니다.
하다, 하다, 하다, 하다, 하다를 할 수 있습니다.dpkg-checkbuilddeps
이 작업에 사용할 수 있습니다.
dpkg-checkbuilddeps -d apt /dev/null
apt가 설치되어 있는지 확인합니다.
가 , 가상 apt가 apt 2.3.15로 설치되어 있는지 여부를 합니다.x-window-manager
는, 있는 패키지의 됩니다.「 」、 「 」 、 「 」
dpkg-checkbuilddeps -d 'apt (>= 2.3.15), grep:amd64, x-window-manager' /dev/null
dpkg-checkbuilddeps는 dpkg-checkbuilddeps가 충족되는지 여부를 나타냅니다.은 " " "만 합니다.dpkg-checkbuilddeps
둘 이상의 패키지가 설치되어 있는지 확인하려는 경우에도 한 번 클릭합니다.
하고 있고,할 수 실장은 합니다).Ubuntu)은, 「Ubuntu」, 「Ubuntu」, 「Ubuntu」, 「Dp」입니다.which
은 사용할 수 있습니다 :)
#!/bin/bash
pkgname=mutt
which $pkgname > /dev/null;isPackage=$?
if [ $isPackage != 0 ];then
echo "$pkgname not installed"
sleep 1
read -r -p "${1:-$pkgname will be installed. Are you sure? [y/N]} " response
case "$response" in
[yY][eE][sS]|[yY])
sudo apt-get install $pkgname
;;
*)
false
;;
esac
else
echo "$pkgname is installed"
sleep 1
fi
을 위해 POSIX를 하는 것이 .command -v
다른 비슷한 질문에서 언급한 것처럼요.
경우, 「 」which $pkgname > /dev/null
로 대체해야 command -v $pkgname
를 참조해 주세요.
패키지에 명령줄 인터페이스가 있는 경우 패키지를 설치하기 전에 명령줄 도구를 호출하여 출력을 평가하여 패키지가 존재하는지 확인할 수 있습니다.
여기 조타 장치라는 패키지의 예가 있습니다.
#!/bin/bash
# Call the command for the package silently
helm > /dev/null
# Get the exit code of the last command
command_exit_code="$(echo $?)"
# Run installation if exit code is not equal to 0
if [ "$command_exit_code" -ne "0" ]; then
# Package does not exist: Do the package installation
else
echo "Skipping 'helm' installation: Package already exists"
fi;
저는 원라이너가 더 우아하다고 생각합니다.
dpkg -V command || sudo apt-get install command
설명: apt-get은 dpkg이 현재 설치를 확인하지 못한 경우에만 호출됩니다.
dpgk man 페이지에서:
EXIT STATUS
0 The requested action was successfully performed. Or a check or assertion command returned true.
1 A check or assertion command returned false.
2 Fatal or unrecoverable error due to invalid command-line usage, or interactions with the system, such as accesses to the database, memory allocations, etc.
다음 방법을 사용합니다.
which mySQL 2>&1|tee 1> /dev/null
if [[ "$?" == 0 ]]; then
echo -e "\e[42m MySQL already installed. Moving on...\e[0m"
else
sudo apt-get install -y mysql-server
if [[ "$?" == 0 ]]; then
echo -e "\e[42mMy SQL installed\e[0m"
else
echo -e "\e[42Installation failed\e[0m"
fi
fi
저는 이 솔루션을 가장 알기 쉬운 방법으로 사용합니다.
function must_install(){
return "$(apt -qq list $var --installed 2> /dev/null |wc -l)"
}
function install_if() {
unset install
for var in "$@"
do
if $(must_install $var)
then
install+="${var} "
fi
done
if [ -n "$install" ];
then
sudo apt-get install -qy $install
fi
}
건 ★★★★★★★★★★★★★★★★★★★★.must_install
는 1 됩니다.거짓이다if
test
를 사용합니다.[]
.
install_if
는, 스페이스로 구분된 임의의 수의 패키지를 사용합니다.
는 '오빠'입니다.apt
)8)
모든 답은 좋지만 저 같은 초보자들이 이해하기에는 복잡한 것 같습니다.여기 제게 효과가 있었던 해결책이 있습니다.Linux 환경은 centOS이지만 모든 배포에서 동작하는지 확인할 수 없습니다.
PACKAGE_NAME=${PACKAGE_NAME:-node}
if ! command -v $PACKAGE_NAME > /dev/null; then
echo "Installing $PACKAGE_NAME ..."
else
echo "$PACKAGE_NAME already installed"
fi
언급URL : https://stackoverflow.com/questions/1298066/how-can-i-check-if-a-package-is-installed-and-install-it-if-not
'source' 카테고리의 다른 글
Git을 사용하여 최신 커밋을 새 브랜치로 이동 (0) | 2023.04.14 |
---|---|
플랫 테이블을 트리로 해석하는 가장 효율적이고 우아한 방법은 무엇입니까? (0) | 2023.04.14 |
PowerShell에서 문자열을 정수로 변환하는 방법 (0) | 2023.04.14 |
Swift Array에서 최소/최대값 검색 (0) | 2023.04.14 |
WPF WebBrowser 컨트롤을 사용할 때 스크립트 오류를 억제하려면 어떻게 해야 합니까? (0) | 2023.04.14 |