विश्वसनीय रूप से जांचें कि क्या पैकेज स्थापित है या नहीं


20

मुझे एक साधारण आवश्यकता है। मैं कई चर को परिभाषित करना चाहता हूं जो किसी भी पैकेज के किसी भी संख्या के अनुरूप होंगे जिन्हें मैं एक शेल स्क्रिप्ट के माध्यम से स्थापित करना चाहता हूं।

नीचे नमूना कोड:

MISC="shutter pidgin"
WEB="apache2 mongodb"

for pkg in $MISC $WEB; do
    if [ "dpkg-query -W $pkg | awk {'print $1'} = """ ]; then
        echo -e "$pkg is already installed"
    else
        apt-get -qq install $pkg
        echo "Successfully installed $pkg"
    fi
done

सब कुछ काम करता है, लेकिन तर्क त्रुटिपूर्ण लगता है क्योंकि यह मज़बूती से उन पैकेजों को स्थापित नहीं कर रहा है जो मुझे चाहिए। यह या तो कहता है कि वे पहले ही स्थापित हो चुके हैं या यह उन पैकेजों को स्थापित करने की कोशिश कर रहा है जो पहले ही स्थापित हो चुके हैं।

मैं भी command -vया निम्नलिखित के साथ कोशिश कर रहा हूँ :

if [ "dpkg -l | awk {'print $2'} | grep --regexp=^$pkg$ != """ ]; then

और यहां तक कि के साथ -nऔर -zझंडे अगर लौटे स्ट्रिंग खाली था जाँच करने के लिए। मुझे यकीन है कि मुझे यहाँ कुछ अच्छी समझ आ रही है।

क्या आपके पास कोई विचार है जो मैं यह सुनिश्चित करने के लिए कर सकता हूं कि एक पैकेज वास्तव में स्थापित है या नहीं?

धन्यवाद!


यदि आप apt-get installस्थापित पैकेजों के लिए कॉल करते हैं तो क्या नुकसान है? आप बस फोन कर सकते हैं apt-get install $MISC $WEB
जारो

जवाबों:


15

अनिवार्य रूप से आपको केवल ifस्थिति को बदलने की आवश्यकता है

if dpkg --get-selections | grep -q "^$pkg[[:space:]]*install$" >/dev/null; then

इसका उपयोग करना संभव नहीं है dpkg-query, क्योंकि यह हटाए गए पैकेजों के लिए भी सही है लेकिन शुद्ध नहीं है।

इसके अलावा मैं apt-getसफल संदेश देने से पहले बाहर निकलने के कोड की जांच करने का सुझाव देता हूं :

if apt-get -qq install $pkg; then
    echo "Successfully installed $pkg"
else
    echo "Error installing $pkg"
fi

क्या करता &>है?
तैमूर

@ टैयमोन: दिए गए फ़ाइल ( /dev/nullइस मामले में) में स्टडिन और स्टेडर दोनों को रीडायरेक्ट करें, क्योंकि हमें आउटपुट की जरूरत नहीं है, केवल निकास कोड। यह केवल में काम करता है bash(स्क्रिप्ट की पहली पंक्ति होनी चाहिए #!/bin/bash) अन्यथा उपयोग करें >/dev/null 2>&1
enzotib

@ समय: मैंने तर्क को बदल दिया, क्योंकि मुझे पूर्ववर्ती समाधान में दोष मिला।
enzotib

खबरदार: यदि बैश का उपयोग करके और पाइपफेल विकल्प सेट किया गया है, तो grep -q हेइज़ेनबग्स उत्पन्न कर सकता है। मूल रूप से, gpp dpkg के पूर्ण होने से पहले ही बाहर निकल जाता है (आप उस स्थिति में 0 बाहर निकलने की स्थिति चाहते हैं) इसलिए dpkg पाइप में लिखने में विफल रहता है (जो इसके बजाय एक गैर-0 निकास स्थिति उत्पन्न करता है)। या तो सुनिश्चित करें कि पाइप-पेल सेट नहीं है, या "-q" विकल्प के (शायद छोटे) दक्षता लाभ को छोड़ दें।
रॉन बुर्क

2

आप इसे dpkg-query द्वारा जांच सकते हैं:

if dpkg-query -W -f'${Status}' "$pkg" 2>/dev/null | grep -q "ok installed"; then

ध्यान दें कि * और? वाइल्डकार्ड हैं, यदि वे $ pkg में दिखाई देते हैं। मुझे लगता है कि dpkg-query "ठीक स्थापित" के बजाय "reinst-आवश्यक स्थापित" मुद्रित कर सकता है, अगर पैकेज टूट गया है और कमांड द्वारा पुनः इंस्टॉल करने की आवश्यकता है apt-get install --reinstallजो कि नए पैकेजों को भी स्थापित करने के लिए उपयोग किया जा सकता है।


0
#to check package is installed or not without distribution dependency
#!/bin/bash
read -p "Package Name: " pkg
which $pkg > /dev/null 2>&1
if [ $? == 0 ]
then
echo "$pkg is already installed. "
else
read -p "$pkg is not installed. Answer yes/no if want installation_ " request
if  [ $request == "yes" ]
then
yum install $pkg
fi
fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.