source

패키지가 설치되어 있는지 확인하고 설치되어 있지 않으면 어떻게 해야 합니까?

nicesource 2023. 4. 14. 21:53
반응형

패키지가 설치되어 있는지 확인하고 설치되어 있지 않으면 어떻게 해야 합니까?

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" (패키지가 Linuxdpkg 치트시트)

조금 더 명확하게 하기 위해 패키지를 확인하고 필요에 따라 설치하는 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-querystderr 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와 같은 간단한 helloinstalled로로 합니다.not-installed 없이--purge.

Ubuntu 20.10에서 테스트.

Python 이 python apt

3에는 Python 3 패키지가 되어 .aptUbuntu 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 스크립트에서 프로그램이 존재하는지 확인하려면 어떻게 해야 합니까?

「 」를 참조해 주세요.

Ubuntu는 PPA(Personal Package Archive)를 추가했으며 PPA 패키지는 다른 결과를 가져옵니다.

  1. 네이티브 Debian 저장소 패키지가 설치되지 않았습니다.

    ~$ dpkg-query -l apache-perl
    ~$ echo $?
    1
    
  2. 호스트에 등록되고 설치된 PPA 패키지:

    ~$ dpkg-query -l libreoffice
    ~$ echo $?
    0
    
  3. 호스트에 등록되었지만 설치되지 않은 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-upgradeOPMMMMD의 경우도 있습니다.

--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」이기 때문입니다.aptcli를 사용하다리스트 패키지는 안정되어 있을 것 같기 때문에, 이 경고는 버려도 좋다고 생각합니다. 조용해집니다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 됩니다.거짓이다iftest를 사용합니다.[].

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

반응형