일부 프로그램이 이미 설치되어 있는지 확인하는 스크립트


11

프로그램이 이미 설치되어 있는지 확인하고 설치되어 있지 않은 경우 설치하는 bash 스크립트를 어떻게 만들 수 있습니까?

당신의 도움을 주셔서 감사합니다.

지금까지 내가 작성한 코드는 다음과 같습니다.

#/bin/bash

PS3="choose an option"

select opcion in "Installing_Youtube"  "exit"

do

    case $opcion in


        "Installing_Youtube")

            youtube-dl > /usr/bin
            if [ $? -eq 127 ] ; then
                echo "installing youtube"
                 apt-get update
                 apt-get install youtube-dl
                mkdir Videos
            else
                echo "Youtube already installed"
            fi

        ;;


        "exit")
            exit

10
덮어 쓰 /usr/bin시겠습니까?
D. Ben Knoble

1
패키지 이름과 실행 파일 이름을 구별하고 있습니까? 아니면 둘 다 확인 하시겠습니까? 만 조지의 대답은 현재 검사 실행 파일
Xen2050

왜 확인하고 싶습니까? 이 스크립트의 용도는 무엇입니까?
Braiam

@Braiam 최소한 apt를 사용하면 이미 설치된 패키지를 설치하면 다른 패키지의 종속성으로 만 설치된 경우 상태가 자동에서 수동으로 변경됩니다. 다른 패키지를 나중에 제거하면이 패키지는 더 이상 자동 제거 표시가되지 않습니다. 이전 설치에서 편집 한 패키지 목록을 새 패키지로 설치하는 스크립트가 있습니다. 이 기술은 새로운 시스템의 혼란을 막아줍니다.
Joe

@Joe는 나쁜 해결책입니다. 대신 설치된 패키지 목록을 가져 와서 apt-mark showmanual다음 과 같이 설치해야합니다 apt-get install "$(< package.list)".
Braiam

답변:


11

당신은 이것을 할 수 있습니다 :

dpkg -s <packagename> &> /dev/null

그런 다음 종료 상태를 확인하십시오. 위 명령의 종료 상태가 0패키지와 설치된 경우에만 해당 됩니다 .

그래서:

   #!/bin/bash

    echo "enter your package name"
    read name

    dpkg -s $name &> /dev/null  

    if [ $? -ne 0 ]

        then
            echo "not installed"  
            sudo apt-get update
            sudo apt-get install $name

        else
            echo    "installed"
    fi

그렇지 않다면? 라인에 무슨 일이 sudo apt install $name? 이 명령은 다음 줄로 넘어 가야합니다 ... 그렇지 않으면, 훌륭합니다 ...
Zanna

3
소프트웨어는 다양한 방법으로 설치 될 수 있으며 dpkg설치된 데비안 패키지에만 관련이 있습니다. OP의 특별한 경우, 예 youtube-dl를 들어 파이썬의 패키지 관리자를 통해 설치할 수도 있습니다pip
Sergiy Kolodyazhnyy

2
왜 안돼 if dpkg -s “$name” &> /dev/null ; then? 동일한 효과, 더 깨끗하고 명확한 imo.
D. Ben Knoble

실제로, 종료 상태를 확인하는 것은 정확히 무엇을 if합니까 ...
ZANNA

4

스크립트에서 사용하기 위해 작성한 함수는 다음과 같습니다. 필요한 패키지가 설치되어 있는지 확인하고 설치되어 있지 않은 경우 사용자에게 설치하라는 메시지를 표시합니다. 매개 변수로 패키지 이름이 필요합니다. 필요한 프로그램이 속한 패키지 이름을 모르면 찾아 볼 수 있습니다. 여기 에 대한 정보가 있습니다 .

function getreq {
dpkg-query --show  "$1"
if [ "$?" = "0" ];
then
    echo "$1" found
else
    echo "$1" not found. Please approve installation.
    sudo apt-get install "$1"
    if [ "$?" = "0" ];
    then echo "$1" installed successfully.
    fi
fi
}

3

이 명령 행은 which프로그램을 사용하여 점검하며 0설치되어 있거나 설치되어 1있지 않은 경우 리턴 합니다 .

which apache | grep -o apache > /dev/null &&  echo 0 || echo 1

물론 스크립트에서 다음과 같이 사용합니다.

which "$1" | grep -o "$1" > /dev/null &&  echo "Installed!" || echo "Not Installed!"

간단한 사용법은 다음과 같습니다.

#!/usr/bin/env bash
set -e

function checker() { 
        which "$1" | grep -o "$1" > /dev/null &&  return 0 || return 1 
}

if checker "$1" == 0 ; then echo "Installed"; else echo "Not Installed!"; fi

몇 가지 사항에 유의하십시오.

  1. 설치하는 동안 dependenciy 문제를 해결해야합니다
  2. 설치 중 스크립트와의 상호 작용을 피하려면 여기를 참조 하십시오. 를 .
  3. 해당 함수에서 리턴 값을 포착하여 설치 여부를 결정하는 데 사용할 수 있습니다.

which휴대 할 수없는 슈퍼입니다. command -v대신 자주 사용 하지만 찾고자하는 이름의 유형 (별칭, 기능, 실행 가능 등)에 크게 좌우됩니다.
D. Ben Knoble

우분투 머신에 대한 질문에 이식성이없는 슈퍼? 이것은 Unix & Linux사이트 가 아닙니다 ! 내가 Unix & Linux사이트 에서 대답한다면 다른 문제가 될 것입니다!
George Udosen

3

왜 먼저 확인하고 싶습니까? 그럴만한 이유가 없으면 끝내지 마십시오 apt-get install package. 이미 설치되어 있으면 사용 가능한 최신 버전이 있으면 업데이트되고 설치되어 있고 최신 버전이면 아무 일도 일어나지 않습니다. 적용해야 할 구성이있는 경우 패키지에 의존하는 구성 패키지 작성 또는 ansible과 같은 구성 관리 소프트웨어 사용과 같은 다른 옵션이 있습니다.


1
어떤 일이 종종 일어날 것입니다 : 최소한 apt를 사용하면 이미 설치된 패키지를 설치하면 다른 패키지의 종속성으로 만 설치된 경우 상태가 자동에서 수동으로 변경됩니다. 다른 패키지를 나중에 제거하면이 패키지는 더 이상 자동 제거 표시가되지 않습니다. 이전 설치에서 편집 한 패키지 목록을 새 패키지로 설치하는 스크립트가 있습니다. 이 기술은 새로운 시스템을 혼란스럽게하지 않습니다.
Joe

2

다음을 사용하여 설치된 패키지를 확인하는 쉬운 방법입니다 apt-mark.

apt-mark showinstall설치 (이미 설치되었거나 설치 대기중인) 로 표시된 모든 패키지를 나열합니다 . 그 후에는 관심있는 패키지를 잡는 것이 간단합니다.

예: apt-mark showinstall | grep -q "^$PACKAGE_NAME$" && echo "installed" || echo "not"


당신은 올바른 길을 가고 있습니다! 오 탐지를 제거하려면이 값으로 변경하십시오. apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $"&& echo "installed"|| echo "not"
Eric Mintz

@EricMintz-개선 주셔서 감사합니다! 편집했습니다.
user535733
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.