สคริปต์เพื่อตรวจสอบว่ามีบางโปรแกรมติดตั้งไว้แล้ว


11

ฉันจะสร้างสคริปต์ทุบตีที่ตรวจสอบว่ามีการติดตั้งโปรแกรมไว้แล้วและยังไม่ติดตั้งหรือไม่

ขอบคุณสำหรับความช่วยเหลือของคุณ.

นี่คือรหัสที่ฉันมี:

#/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

@ โจซึ่งเป็นทางออกที่ไม่ดี คุณควรแทนเพียงได้รับรายชื่อของแพคเกจติดตั้งด้วยแล้วติดตั้งกับสิ่งที่ต้องการ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ตัวอย่างเช่นสามารถติดตั้งได้ผ่านทางผู้จัดการแพ็คเกจของ Pythonpip
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. คุณจะต้องจัดการกับปัญหาพึ่งพาในขณะติดตั้ง
  2. เพื่อหลีกเลี่ยงการโต้ตอบกับสคริปต์ระหว่างการติดตั้งดูที่นี่สำหรับตัวอย่าง
  3. คุณสามารถตรวจจับค่าที่ส่งคืนจากฟังก์ชันนั้นเพื่อใช้ในการตัดสินใจว่าจะติดตั้งหรือไม่

whichมันไม่ใช่แบบพกพาสุด ๆ ฉันใช้บ่อยๆcommand -vแต่ขึ้นอยู่กับประเภทของชื่อที่คุณกำลังมองหา (นามแฝง, ฟังก์ชั่น, ปฏิบัติการได้ & c.)
D. Ben Knoble

Super non-portable สำหรับคำถามที่ใช้กับเครื่อง Ubuntu หรือไม่? นี่ไม่ใช่Unix & Linuxไซต์! ถ้าฉันตอบมันในUnix & Linuxไซต์ที่จะเป็นเรื่องอื่น!
George Udosen

3

ทำไมคุณต้องการตรวจสอบมันตั้งแต่แรก? ถ้าคุณไม่มีเหตุผลที่ดีก็อย่าทำมันapt-get install packageซะ หากติดตั้งไว้แล้วจะมีการอัปเดตหากมีรุ่นที่ใหม่กว่าถ้าติดตั้งไว้และเป็นรุ่นล่าสุดจะไม่มีอะไรเกิดขึ้น ในกรณีที่คุณมีการกำหนดค่าบางอย่างที่จำเป็นต้องใช้มีตัวเลือกอื่น ๆ เช่นการสร้างแพ็คเกจการกำหนดค่าซึ่งขึ้นอยู่กับแพคเกจหรือการใช้ซอฟต์แวร์การจัดการการกำหนดค่าเช่น ansible


1
บางสิ่งบางอย่างจะเกิดขึ้น: อย่างน้อยเมื่อมี apt การติดตั้งแพคเกจที่ติดตั้งไว้แล้วจะเปลี่ยนสถานะจากอัตโนมัติเป็นแมนนวลหากถูกติดตั้งเป็นการอ้างอิงของแพ็คเกจอื่นเท่านั้น หากแพ็คเกจอื่นนั้นถูกลบในภายหลังแพ็คเกจนี้จะไม่ถูกทำเครื่องหมายเพื่อลบอัตโนมัติอีกต่อไป ฉันมีสคริปต์เพื่อติดตั้งรายการแพคเกจที่แก้ไขจากการติดตั้งก่อนหน้าไปยังแพ็คเกจใหม่ เทคนิคนี้ป้องกันไม่ให้ระบบใหม่ยุ่งเหยิง
Joe

2

วิธีง่ายๆในการตรวจสอบแพ็คเกจที่ติดตั้งโดยใช้apt-mark:

apt-mark showinstallจะแสดงรายการแพคเกจทั้งหมดที่ระบุว่าติดตั้ง ( ติดตั้งแล้วหรือเข้าคิวเพื่อติดตั้ง) หลังจากนั้นก็เป็นเรื่องง่าย ๆ ในการ grepping แพ็คเกจที่คุณใส่ใจ

ตัวอย่าง: apt-mark showinstall | grep -q "^$PACKAGE_NAME$" && echo "installed" || echo "not"


คุณมาถูกทางแล้ว! เพียงแค่เปลี่ยนเป็นสิ่งนี้เพื่อกำจัดผลบวกปลอม: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo "ติดตั้ง" || echo "not"
Eric Mintz

@EricMintz - ขอบคุณสำหรับการปรับปรุง! แก้ไข
user535733
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.