यदि कुछ प्रोग्राम पहले से ही स्थापित है, तो जांच करने के लिए स्क्रिप्ट


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?
डी। बेन नोबल

1
क्या आप पैकेज के नाम और निष्पादन योग्य फ़ाइलनामों के बीच अंतर कर रहे हैं? या दोनों की जाँच करना चाहते हैं? केवल जॉर्ज का जवाब वर्तमान में निष्पादकों के लिए जाँच करता है
Xen2050

आप इसकी जांच क्यों करना चाहते हैं? इस लिपि का शुद्ध उपयोग क्या है?
Braiam

@Braiam कम से कम उपयुक्त के साथ, पहले से ही स्थापित पैकेज को स्थापित करने से इसकी स्थिति स्वचालित से मैन्युअल में बदल जाएगी यदि यह केवल दूसरे पैकेज की निर्भरता के रूप में स्थापित किया गया था। यदि बाद में दूसरे पैकेज को हटा दिया जाता है, तो यह पैकेज ऑटो हटाने के लिए चिह्नित नहीं किया जाएगा। मेरे पास पिछली स्थापना से संकुल की संपादित सूची को एक नए में स्थापित करने के लिए एक स्क्रिप्ट है। यह तकनीक नई प्रणाली की गड़बड़ी करने से बचाती है।
जो

@ जो एक बुरा उपाय है। आपको इसके बजाय बस 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? कमांड को अगली पंक्ति पर जाने की जरूरत है ... अन्यथा, अच्छा काम ...
ज़न्ना

3
ध्यान दें कि सॉफ़्टवेयर को विभिन्न तरीकों से स्थापित किया जा सकता है, और dpkgकेवल स्थापित डेबियन पैकेजों के लिए प्रासंगिक है। ओपी के विशेष मामले में, youtube-dlउदाहरण के लिए अजगर के पैकेज मैनेजर के माध्यम से भी स्थापित किया जा सकता हैpip
सर्गी कोलोडियाज़नी

2
क्यों नहीं if dpkg -s “$name” &> /dev/null ; then? वही प्रभाव, क्लीनर / स्पष्ट imo।
डी। बेन नोबल

वास्तव में, बाहर निकलने की स्थिति की जाँच करना वास्तव में क्या 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इसके बजाय का उपयोग करता हूं , लेकिन यह उस प्रकार के नाम पर निर्भर करता है जिसे आप खोज रहे हैं (उपनाम, फ़ंक्शन, निष्पादन योग्य, और सी।)
डी। बेन नोबल

उबंटू मशीन के लिए एक प्रश्न के लिए सुपर गैर-पोर्टेबल? यह Unix & Linuxसाइट नहीं है! अगर मैं Unix & Linuxसाइट पर इसका जवाब दे रहा हूं तो यह अलग बात होगी!
जॉर्ज उदन

3

आप इसे पहले स्थान पर क्यों जाँचना चाहते हैं? जब तक आपके पास इसके लिए एक अच्छा कारण नहीं है, तब तक ऐसा न करें apt-get install package। यदि यह पहले से ही स्थापित है तो इसे अपडेट किया जाएगा यदि कोई नया संस्करण उपलब्ध है, यदि यह स्थापित है और यह अद्यतित है, तो कुछ भी नहीं होगा। यदि आपके पास कुछ कॉन्फ़िगरेशन है जिसे लागू करने की आवश्यकता है, तो अन्य विकल्प हैं, जैसे कॉन्फ़िगरेशन पैकेज बनाना जो पैकेज पर निर्भर करता है या कॉन्फ़िगरेशन प्रबंधन सॉफ़्टवेयर का उपयोग कर रहा है जैसे ansible।


1
कुछ अक्सर होता है: कम से कम उपयुक्त के साथ, पहले से ही स्थापित पैकेज को स्थापित करने से इसकी स्थिति स्वचालित से मैन्युअल में बदल जाएगी यदि यह केवल दूसरे पैकेज की निर्भरता के रूप में स्थापित किया गया था। यदि बाद में दूसरे पैकेज को हटा दिया जाता है, तो यह पैकेज ऑटो हटाने के लिए चिह्नित नहीं किया जाएगा। मेरे पास पिछली स्थापना से संकुल की संपादित सूची को एक नए में स्थापित करने के लिए एक स्क्रिप्ट है। यह तकनीक नई प्रणाली की गड़बड़ी करने से बचाती है।
जो

2

उपयोग करने के लिए स्थापित पैकेजों की जांच करने का एक आसान तरीका apt-mark:

apt-mark showinstallसभी संकुल चिह्नित सूची जाएगा स्थापित (पहले से स्थापित है, या स्थापना के लिए कतारबद्ध)। उसके बाद, यह आपके द्वारा देखभाल किए जाने वाले पैकेज (ओं) को प्राप्त करने का एक सरल मामला है।

उदाहरण: apt-mark showinstall | grep -q "^$PACKAGE_NAME$" && echo "installed" || echo "not"


आप सही रास्ते पर हैं! झूठी सकारात्मकता को खत्म करने के लिए बस इसे बदल दें: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" और& इको "स्थापित" || इको "नहीं"
एरिक मिन्टज़

@ EricMintz - सुधार के लिए धन्यवाद! संपादित।
user535733
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.