यदि परीक्षण पैकेज में APT स्थापित है तो परीक्षण करें


10

मैं एक शेल स्क्रिप्ट विधि का परीक्षण / रिपोर्ट करना चाहता हूं यदि कोई पैकेज स्थापित है। मुझे विवरण की आवश्यकता नहीं है, तर्क प्रवाह सेट करने के लिए केवल बूलियन वापसी। मैंने एक पैकेज स्थापित होने पर फाइंड को देखा , लेकिन dpkgजटिल आउटपुट देता है और इसका प्रारूप इस आधार पर बदलता है कि पैकेज डेबियन रिपॉजिटरी में है या उबंटू पीपीए में।

मैंने पाया कि apt-cacheबहुत अच्छा काम करता है और मैं इस विधि के साथ आया:

is_installed=0
test_installed=( `apt-cache policy package-name | grep "Installed:" ` )
[ ! "${test_installed[1]}" == "(none)" ] && is_installed=1

क्या कोई सरल या अधिक प्रत्यक्ष तरीका जानता है?

जवाबों:


12

dpkg-query जैसा कि आपके लिंक किए गए पोस्ट में नौकरी के लिए सबसे सही उपकरण लगता है, जैसे कि स्क्रिप्टिंग संदर्भ में APT सिस्टम से सीधे बाँधने के लिए उपलब्ध पायथन लाइब्रेरीज़ का उपयोग करने के अलावा।

के साथ dpkg-query:

dpkg-query -Wf'${db:Status-abbrev}' package-name 2>/dev/null | grep -q '^i'

0यदि पैकेज स्थापित है तो सही (एग्जिट स्टेटस इन शेल स्क्रिप्ट), 1अन्यथा गलत (एग्जिट स्टेटस ) वापस आ जाएगी।

  • -Wका अर्थ है "दिखाएँ" ( dpkg-queryएक अनुरोधित कार्रवाई होनी चाहिए)।
  • -f आउटपुट का स्वरूप बदलता है।
  • db:Status-abbrev पैकेज की स्थिति का संक्षिप्त रूप है।
  • 2>/dev/nulldpkg-queryयदि कोई अमान्य पैकेज नाम दिया गया है, तो मौन । इसे कैसे संभाला जाना चाहिए, यह मामला-दर-मामला हो सकता है।
  • grep -q सच है अगर वहाँ एक मैच है, झूठे अन्यथा।

यदि इसका उपयोग अक्सर किया जाता है, तो इसे एक सरल कार्य बनाया जा सकता है:

#!/bin/sh
debInst() {
    dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'
}

if debInst "$1"; then
    printf 'Why yes, the package %s _is_ installed!\n' "$1"
else
    printf 'I regret to inform you that the package %s is not currently installed.\n' "$1"
fi

या बस

#!/bin/sh
if dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'; then
    printf 'Why yes, the package "%s" _is_ installed!\n' "$1"
else
    printf 'I regret to inform you that the package "%s" is not currently installed.\n' "$1"
fi

हालांकि यह निस्संदेह सही है कि मुझे लगता है कि dpkg-query -l "$package" | grep -q ^.iआमतौर पर पर्याप्त (और याद रखना आसान है)।
फॉग्ज

1
@ फॉग: हां, यह इस बात पर निर्भर करता है कि उसे स्क्रिप्ट में रहना चाहिए या नहीं। इसके अलावा, dpkg-query -lआउटपुट पत्थर में सेट नहीं है क्योंकि यह सिर्फ एक उपयोगकर्ता प्रस्तुति मोड है, इसलिए यदि प्रस्तुति बदलती है तो शायद ऐसी स्क्रिप्ट टूट जाएगी।
डैनियल एंडरसन

@Daniel। मुझे रिटर्न कोड दृष्टिकोण पसंद है। कृपया कोड में विवरण के साथ मेरा उत्तर देखें।
तहरो

10.04 पर प्रारूप विकल्प db: Status-abbrev मौजूद नहीं है - मैंने उपयोग किया: dpkg-query -Wf'${Version}' ${pkg} 2>/dev/null | grep -q '^\d*'एक ही प्रभाव के लिए।
स्कूट्टीनोमड

1

मैंने इन परिणामों के साथ तीन पैकेजों पर डैनियल के सुझावों का परीक्षण किया:

  1. देशी डेबियन रिपोजिटरी पैकेज स्थापित नहीं:

    ~$ dpkg-query -Wf'${db:Status-abbrev}' apache-perl
    ~$ echo $?
    1
    
  2. पीपीए पैकेज मेजबान पर पंजीकृत है और स्थापित किया गया है:

    ~$ dpkg-query -Wf'${db:Status-abbrev}' libreoffice
    ~$ echo $?
    0
    
  3. PPA पैकेज होस्ट पर पंजीकृत है लेकिन स्थापित नहीं है:

    ~$ dpkg-query -Wf'${db:Status-abbrev}' 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-cache policyकमांड की वापसी को पार्स करने के साथ रहूंगा ।


ठीक है, आपके कोड उदाहरण वह नहीं हैं जो मैंने कहा था कि आपको क्या करना चाहिए, लेकिन मुझे लगता है कि आपने grepअपने चिपकाने में सिर्फ भाग को याद किया है । मैं वास्तव में आपके मुद्दे को पुन: पेश नहीं कर सकता, लेकिन ऐसा इसलिए हो सकता है क्योंकि कोड उदाहरण वर्तमान में अपूर्ण हैं, इसलिए कृपया इसे ठीक करें। क्या आप डेबियन या उबंटू चलाते हैं?
डैनियल एंडर्सन

मैं Ubuntu 10.04 चला रहा हूं (क्या PPA समर्थित कोई सीधा डेबियन नहीं है?)। मेरे कोड ने आपके grep को गिरा दिया क्योंकि 1) dkpg-query कमांड stdout को कुछ नहीं लिखती है और grep हमेशा एक रिटर्नकोड फेंकता है। अगर स्थापित किया गया है तो dpkg-query रिटर्नकोड 0 है।
ताहिर

2
1. अपनी पोस्ट "डेबियन" तब टैग न करें। 2. मुझे नहीं लगता कि आप grepकमांड में खेला गया हिस्सा समझ गए हैं , इसलिए आपने इसे छीन लिया, और अब आप कहते हैं कि यह काम नहीं करता है? grep -qवापसी कोड देता है 1अगर यह नहीं करता है से मेल खाते हैं, यानी कार्यक्रम है नहीं स्थापित या अनुपलब्ध, या 0प्रोग्राम स्थापित किया जाता है। मैंने अपने पोस्ट में बताया।
डैनियल एंडरसन

1
#!/bin/bash

# Check for dependencies 
check_deps () {
DEPS=$(echo {dialog,sqlite3,openssh-client})
for i in $DEPS ; do
    dpkg-query -W -f='${Package}\n' | grep ^$i$ > /dev/null
    if [ $? != 0 ] ; then
        echo "Installing deps ..."
        aptitude install $i -y > /dev/null
    fi
done  
}

# execute the check_deps function
check_deps

-1, सवाल निर्भरता जाँच के बारे में नहीं है। इसके अलावा, यह बताएं कि कमांड के हिस्से क्या कर रहे हैं: अन्यथा अन्य लोग यह नहीं देख सकते कि क्या चल रहा है।
डैनियल एंडरसन

DEPS=$(echo {dialog,sqlite3,openssh-client})समान रूप से लिखा जा सकता है DEPS="dialog sqlite3 openssh-client"
डैनियल एंडरसन

1

मुझे डैनियल एंडरसन का जवाब पसंद है, लेकिन यह मेरे लिए काम नहीं करता था। मैं Ubuntu 12.04 पर हूं।

से dpkg आदमी पेज , db:Status-abbrevकेवल dpkg में 1.16.2+ काम करता है:

          db:Status-Abbrev
                 It  contains the abbreviated package status, such as “ii”
                 (since dpkg 1.16.2).

मेरा समाधान विरासत के व्यवहार का उपयोग करना था, सिर्फ Statusसूत्रकार:

dpkg-query -Wf'${Status}' {my_pkg_name}

आउटपुट

install ok installed 

मुझे लगता है कि यह अन्य अभ्यावेदन में "ii" की प्रेरणा थी।

इसलिए, पूरी तरह से dpkg के पुराने संस्करण पर काम करने के लिए डैनियल एंडरसन के उत्तर को अनुकूलित करने के लिए, और इस प्रकार पुराने Ubuntu डिस्ट्रोस:

dpkg-query -Wf'${Status}' {your_pkg_name} 2>/dev/null | grep -q "install ok installed"

यह दिखाता है:

  • 0 - पैकेज स्थापित है, या
  • 1 - पैकेज स्थापित नहीं है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.