जांचें कि क्या एप्टी-गेट पैकेज स्थापित है और अगर लिनक्स पर नहीं है तो इसे स्थापित करें


223

मैं एक उबंटू प्रणाली पर काम कर रहा हूं और वर्तमान में यही मैं कर रहा हूं:

if ! which command > /dev/null; then
   echo -e "Command not found! Install? (y/n) \c"
   read
   if "$REPLY" = "y"; then
      sudo apt-get install command
   fi
fi

यह वही है जो ज्यादातर लोग करते हैं? या वहाँ एक और अधिक सुंदर समाधान है?


7
कमांड नाम हमेशा उस पैकेज के नाम को प्रतिबिंबित नहीं करते हैं जो वे संबंधित हैं। आप बड़े लक्ष्य क्या हैं? आप इसे स्थापित करने का प्रयास क्यों नहीं करते हैं, और सबसे खराब स्थिति यह नहीं है, क्योंकि यह पहले से ही स्थापित है।
viam0Zah

8
सौभाग्य से, एप-गेट स्थापित करना बेकार है, इसलिए इसे चलाने के लिए सुरक्षित है और इस बारे में चिंता न करें कि यह स्थापित है या नहीं।
डेविड बाउकम

@ डेविडबाकुम की टिप्पणी का जवाब होना चाहिए कि उसे सबसे अधिक वोट मिले।
निर्मल

@ निर्मल, जवाब बना।
डेविड बाउकम

1
संबंधित, आपको उपयोग करना चाहिए command -v <command>; नहीं है which <command>। यह भी देखें कि क्या कोई प्रोग्राम बैश स्क्रिप्ट से मौजूद है या नहीं
jww

जवाबों:


314

यह जाँचने के लिए कि packagenameक्या स्थापित किया गया था, टाइप करें:

dpkg -s <packagename>

तुम भी dpkg-queryअपने उद्देश्य के लिए एक neater उत्पादन किया है कि उपयोग कर सकते हैं , और भी जंगली कार्ड स्वीकार करता है।

dpkg-query -l <packagename>

पैकेज किसके पास है command, यह जानने के लिए प्रयास करें:

dpkg -S `which <command>`

अधिक जानकारी के लिए, लेख देखें कि क्या लिनक्स और dpkg धोखा शीट में पैकेज स्थापित है


31
यदि आप एक व्यक्ति के रूप में इस गैर-प्रोग्राम को चाहते हैं तो आप इस जानकारी का उपयोग कर सकते हैं क्योंकि यह खड़ा है। हालाँकि आप स्क्रिप्टिंग के लिए यहाँ रिटर्न कोड पर निर्भर नहीं कर सकते हैं या स्क्रिप्टिंग के लिए अकेले आउटपुट की कमी / कमी है। आपको इस प्रश्न के लिए उनकी उपयोगिता को सीमित करते हुए, इन कमांड के आउटपुट को स्कैन करना होगा।
उपअंडम

4
अजीब तरह से, मैंने हाल ही में पता लगाया है कि dpkg-query एक लापता पैकेज पर 1 लौटाता था, अब (Ubuntu 12.04) रिटर्न 0 है, जिससे मेरे जेनकींस पर सभी प्रकार की परेशानी नोड सेटअप स्क्रिप्ट का निर्माण करती है! dpkg -s प्रतिफल स्थापित किए गए पैकेज पर 0 देता है, और पैकेज पर 1 स्थापित नहीं है।
Therealstubot

17
अरे, ओपी ने ifउपयोग के लिए कहा । मैं भी ifउपयोग के लिए देख रहा हूँ ।
टॉम ज़ातो -

1
@Therealstubot: मैं भी Ubuntu 12.04 का उपयोग कर रहा हूं और dpkg -sअनुपलब्ध पैकेजों पर 1 लौटाता हूं और अन्यथा, जैसा कि होना चाहिए। पहले (या हाल के) संस्करणों पर कैसे भिन्न था?
MestreLion

4
एक नोट: dpkg -sयदि पैकेज स्थापित किया गया था और फिर हटा दिया गया है तो शून्य वापस आ जाता है - इस मामले में यह Status: deinstall ok config-filesया समान है, इसलिए यह "ठीक" है - इसलिए मेरे लिए, यह एक सुरक्षित परीक्षा नहीं है। dpkg-query -lइस मामले में भी उपयोगी परिणाम नहीं दिखता है।
उत्सुक

86

थोड़ा और अधिक स्पष्ट होने के लिए, यहां थोड़ी सी बैश स्क्रिप्ट है जो पैकेज की जांच करती है और यदि आवश्यक हो तो इसे स्थापित करती है। बेशक, आप यह पता लगाने पर अन्य काम कर सकते हैं कि पैकेज गायब है, जैसे कि बस एक त्रुटि कोड के साथ बाहर निकलना।

REQUIRED_PKG="some-package"
PKG_OK=$(dpkg-query -W --showformat='${Status}\n' $REQUIRED_PKG|grep "install ok installed")
echo Checking for $REQUIRED_PKG: $PKG_OK
if [ "" = "$PKG_OK" ]; then
  echo "No $REQUIRED_PKG. Setting up $REQUIRED_PKG."
  sudo apt-get --yes install $REQUIRED_PKG 
fi

यदि स्क्रिप्ट GUI के भीतर चलती है (उदाहरण के लिए यह एक Nautilus स्क्रिप्ट है), तो आप शायद 'sudo' मंगलाचरण को 'gksudo' के साथ बदलना चाहेंगे।


5
--force-yesएक गरीब विचार लगता है। मैन पेज से: "यह एक खतरनाक विकल्प है, जो बिना किसी कारण के शीघ्रता से जारी रखने का कारण बन सकता है यदि यह संभावित रूप से हानिकारक कुछ कर रहा है। इसका उपयोग बहुत विशेष स्थितियों को छोड़कर नहीं किया जाना चाहिए। -फोर्स-यस का उपयोग करके संभवतः आपके सिस्टम को नष्ट किया जा सकता है। ! " इसे स्क्रिप्ट में इस्तेमाल करने से यह और भी खराब हो जाता है।
गतिविधि

68

यह एक-लाइनर 'नैनो' पैकेज के लिए 1 (स्थापित) या 0 (स्थापित नहीं) देता है।

$(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed")

भले ही पैकेज मौजूद नहीं है / उपलब्ध नहीं है।

नीचे दिया गया उदाहरण 'नैनो' पैकेज स्थापित करता है यदि यह संस्थापित नहीं है।

if [ $(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed") -eq 0 ];
then
  apt-get install nano;
fi

4
इस पर मेरी भिन्नता:dpkg-query -W -f='${Status}' MYPACKAGE | grep -q -P '^install ok installed$'; echo $?
ThorSummoner

@ थोरसुमोनर: यह समझाने के लिए कि आपका बेहतर क्यों है?
knocte

1
@knocte मुझे यकीन नहीं है कि उद्देश्यपूर्ण रूप से बेहतर होने के बारे में तर्क दिया जाना चाहिए। हालांकि मुझे विश्वास है कि वर्बटिम पोस्ट का वन-लाइनर परिणाम आउटपुट को निष्पादित करेगा, जिसे मैं एक उत्तर में झूलना नहीं छोड़ना चाहूंगा। मैं जो लाइनर दिखाता हूं वह सिर्फ एक्जिट कोड प्राप्त करने (प्रिंटिंग) का है।
ThorSummoner

1
@ थोरसुमोनर आपको grep -Pउस तरह एक साधारण रेगेक्स की आवश्यकता नहीं है।
ट्रिपल जूल

7
सरल: if ! dpkg-query -W -f='${Status}' nano | grep "ok installed"; then apt install nano; fi- उपयोग करने की आवश्यकता नहीं है grep -c, बस बाहर निकलने की स्थिति का उपयोग करेंgrep
स्टीफन ओस्टरमिलर

17

dpkg -s स्वचालित उपयोग के साथ प्रोग्रामेटिक उपयोग

मुझे पसंद है dpkg -sक्योंकि यह स्थिति के साथ बाहर निकलता है 1यदि कोई भी पैकेज स्थापित नहीं है, तो इसे स्वचालित करना आसान है:

pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
  sudo apt-get install $pkgs
fi

man dpkg दुर्भाग्य से बाहर निकलने की स्थिति का दस्तावेज नहीं है, लेकिन मुझे लगता है कि इस पर भरोसा करने के लिए यह उचित रूप से सुरक्षित होना चाहिए:

-s, --status package-name...
    Report status of specified package.

एक बात ध्यान देने योग्य है कि यह चल रहा है:

sudo apt remove <package-name>

जरूरी नहीं कि कुछ पैकेजों के लिए तुरंत सभी फाइलों को हटा दें (लेकिन दूसरों के लिए, निश्चित रूप से क्यों नहीं?), और सिर्फ हटाने के लिए पैकेज को चिह्नित करता है।

इस स्थिति में, पैकेज अभी भी उपयोग करने योग्य प्रतीत होता है, और जैसा कि इसकी फ़ाइलें अभी भी मौजूद हैं, लेकिन इसे बाद में हटाने के लिए चिह्नित किया गया है।

उदाहरण के लिए यदि आप चलाते हैं:

pkg=certbot

sudo apt install -y "$pkg"
dpkg -s "$pkg"
echo $?

sudo apt remove -y "$pkg"
dpkg -s "$pkg"
echo $?
ls -l /usr/lib/python3/dist-packages/certbot/reporter.py

sudo apt remove --purge certbot
dpkg -s "$pkg"
echo $?
ls -l /usr/lib/python3/dist-packages/certbot/reporter.py

फिर:

  • पहले दो echo $?आउटपुट 0, केवल तीसरा एक आउटपुट1

  • पहले के लिए आउटपुट dpkg -s certbotमें शामिल हैं:

    Status: deinstall ok installed

    जबकि दूसरा कहता है:

    Status: deinstall ok config-files

    और यह केवल शुद्ध होने के बाद गायब हो जाता है:

    dpkg-query: package 'certbot' is not installed and no information is available
  • फ़ाइल /etc/logrotate.d/certbotअभी भी सिस्टम में मौजूद है apt remove, लेकिन उसके बाद नहीं --purge

    हालाँकि, फ़ाइल के /usr/lib/python3/dist-packages/certbot/reporter.pyबाद भी मौजूद है --purge

मुझे समझ में क्यों नहीं आता है, लेकिन helloपैकेज के साथ दूसरे के dpkgबाद apt removeपता चलता है कि वह पैकेज पहले ही बिना हटा दिया गया है --purge:

dpkg-query: package 'hello' is not installed and no information is available

दस्तावेज भी बहुत अस्पष्ट हैं, उदाहरण के लिए:

sudo apt dselect-upgrade

certbotजब इसे चिह्नित किया गया था, तब भी हटाया नहीं गया था, deinstallहालांकि man apt-getयह इंगित करता है कि:

dselect-upgradeपारंपरिक डेबियन पैकेजिंग फ्रंट-एंड, डेसेलेक्ट (1) के साथ संयोजन में उपयोग किया जाता है। dselect-upgrade उपलब्ध संकुल के स्थिति क्षेत्र में dselect (1) द्वारा किए गए परिवर्तनों का अनुसरण करता है, और उस स्थिति को महसूस करने के लिए आवश्यक क्रिया करता है (उदाहरण के लिए, पुराने को हटाने और नए पैकेजों की स्थापना)।

यह सभी देखें:

उबंटू 19.10 पर परीक्षण किया गया।

अजगर का aptपैकेज

एक पूर्व-स्थापित पायथन 3 पैकेज है जिसे aptउबंटू 18.04 में बुलाया गया है जो पायथन एप्ट इंटरफेस को उजागर करता है!

एक स्क्रिप्ट जो चेक करती है कि क्या पैकेज स्थापित है और इसे स्थापित किया गया है यदि नहीं देखा जा सकता है: अजगर-एप एपीआई का उपयोग करके पैकेज कैसे स्थापित करें

यहाँ संदर्भ के लिए एक प्रति है:

#!/usr/bin/env python
# aptinstall.py

import apt
import sys

pkg_name = "libjs-yui-doc"

cache = apt.cache.Cache()
cache.update()
cache.open()

pkg = cache[pkg_name]
if pkg.is_installed:
    print "{pkg_name} already installed".format(pkg_name=pkg_name)
else:
    pkg.mark_install()

    try:
        cache.commit()
    except Exception, arg:
        print >> sys.stderr, "Sorry, package installation failed [{err}]".format(err=str(arg))

जांच करें कि क्या कोई निष्पादन योग्य PATHइसके बजाय है

देखें: यदि कोई प्रोग्राम बैश स्क्रिप्ट से मौजूद है तो मैं कैसे जांच सकता हूं?


Ciro, ou "dpkg -s" निकास कोड पर भरोसा नहीं कर सकता। उदाहरण के लिए यदि आपने एक पैकेज "इंस्टॉल किया है", तो इसे "हटा दें" और "dpkg -s packagename" करने की कोशिश की, तो आपको स्थिति दिखाई देगी: कोड को अनइंस्टॉल करें और बाहर निकलें शून्य (जैसे कि स्थापित किया गया हो)। आपको "dpkg -s" आउटपुट भाई को पार्स करना है।
दिमित्री शेवकोप्लस

@DmitryShevkoplyas रिपोर्ट के लिए धन्यवाद। मैं के साथ उबंटू 19.10 पर पुन: पेश नहीं कर सका: sudo apt install hello; dpkg -s hello; echo $?; sudo apt remove hello; dpkg -s hello; echo $?। क्या आप और विवरण प्रदान कर सकते हैं?
सिरो सेंटिल्ली 郝海东 iro iro 事件 at

1
वास्तव में - "हैलो" पैकेज "dpkg -s" के साथ आपके परीक्षण के मामले में सही ढंग से पैकेज को स्थापित नहीं होने के रूप में दिखाता है और अपेक्षित निकास कोड "1" देता है। लेकिन पैकेज "सर्टिफिकेट" के साथ एक ही इंस्टाल / हटाने की कोशिश करें, फिर आप "स्टेटस: डीइंस्टैप-फाइल्स" को "dpkg -s" आउटपुट के रूप में देखेंगे क्योंकि आपके "apt remove certbot" के बाद आउटपुट और एक्जिट कोड हमें गलत दिखाता है "0"। मेरी गलत धारणा यह थी कि यह किसी भी अन्य पैकेज के लिए सटीक मामला है, लेकिन ऐसा लगता है कि यह सभी के लिए समान नहीं है, जो इससे भी बदतर और कम अनुमानित है। Parse "dpkg -s" आपको चाहिए (c) योदा :)
दिमित्री शेवकोप्लस

11

जब से उबंटू ने अपने "पर्सनल पैकेज आर्काइव" (पीपीए) को जोड़ा था, इस अपडेट की पेशकश करता हूं, क्योंकि इस प्रश्न का उत्तर दिया गया था, और पीपीए पैकेजों का एक अलग परिणाम है।

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

    ~$ dpkg-query -l apache-perl
    ~$ echo $?
    1
  2. PPA पैकेज होस्ट पर पंजीकृत और स्थापित:

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

    ~$ dpkg-query -l 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.

इस पर भी पोस्ट किया गया: /superuser/427318/test-if-a-package-is-installed-in-apt/427898


2
यदि आप एक पैकेज स्थापित करते हैं और निकालते हैं, तो अगले आप dpkg-query पैकेज का उपयोग करते हैं; इको $? पैकेज स्थापित नहीं होने पर भी 0 होगा।
पोल हॉलन

8

UpAAndAdam ने लिखा:

हालाँकि आप बस स्क्रिप्टिंग के लिए यहाँ रिटर्न कोड पर भरोसा नहीं कर सकते

में मेरी अनुभव आप कर सकते हैं dkpg के बाहर निकलने के कोड पर निर्भर हैं।

Dpkg -s का रिटर्न कोड 0 है अगर पैकेज स्थापित है और 1 यदि यह नहीं है, तो सबसे आसान समाधान जो मैंने पाया था वह था:

dpkg -s <pkg-name> 2>/dev/null >/dev/null || sudo apt-get -y install <pkg-name>

मेरे लिए ठीक काम करता है ...


11
के बाद apt-get remove <package>, dpkg -s <package>अभी भी 0 लौटाता है, भले ही पैकेज हैdeinstalled
ThorSummoner

7

यह बहुत अच्छी तरह से काम करने लगता है।

$ sudo dpkg-query -l | grep <some_package_name> | wc -l
  • यह या तो 0स्थापित नहीं है या > 0यदि स्थापित है तो कुछ संख्या ।

8
grep | wc -lएक एंटीपैटर्न है। यह जाँचने के लिए कि क्या कुछ मौजूद है, आप बस चाहते हैं grep -q। वास्तव में होने वाली घटनाओं की गणना करने के लिए (जो इस तरह के परिदृश्य में शायद ही कभी उपयोगी होती है), उपयोग करें grep -c
ट्रिपल

@ ट्राली तो dpkg -s zip | grep -c "Package: zip",? (सैंपल पैकेज के रूप में जिप का उपयोग करना)
डेविड टैबरेरो एम।

@Davdriver यह ठीक नहीं है कि ऊपर क्या है, लेकिन हाँ। एक स्क्रिप्ट में आप शायद grep -q 'Package: zip'एक एग्जिट कोड लौटना चाहते हैं जो यह बताता है कि बिना कुछ छपे ही रिजल्ट मिल गया या नहीं।
ट्रिपल जू

यह अनइंस्टॉल किए गए पैकेजों के लिए भी ठीक काम कर रहा है
mehmet

4

मैं Nultyi के उत्तर के आधार पर एक पर बस गया हूं :

MISSING=$(dpkg --get-selections $PACKAGES 2>&1 | grep -v 'install$' | awk '{ print $6 }')
# Optional check here to skip bothering with apt-get if $MISSING is empty
sudo apt-get install $MISSING

असल में, त्रुटि संदेश से dpkg --get-selections अन्य लोगों की तुलना में पार्स करना बहुत आसान है, क्योंकि इसमें "डीस्टाइप" जैसी स्थिति शामिल नहीं है। यह एक साथ कई पैकेजों की जांच कर सकता है, कुछ आप केवल त्रुटि कोड के साथ नहीं कर सकते हैं।

स्पष्टीकरण / उदाहरण:

$ dpkg --get-selections  python3-venv python3-dev screen build-essential jq
dpkg: no packages found matching python3-venv
dpkg: no packages found matching python3-dev
screen                                          install
build-essential                                 install
dpkg: no packages found matching jq

इसलिए grep सूची से संस्थापित संकुल को हटाता है, और awk संदेश से संकुल नामों को जगाता है, जिसके परिणामस्वरूप MISSING='python3-venv python3-dev jq', जो तुच्छ रूप से एक संस्थापन कमांड में डाला जा सकता है।

मैं नेत्रहीन रूप से जारी नहीं कर रहा हूं apt-get install $PACKAGESक्योंकि टिप्पणियों में उल्लेख किया गया है, यह अप्रत्याशित रूप से उन पैकेजों को अपग्रेड कर सकता है जिन पर आप योजना नहीं बना रहे थे; वास्तव में स्वचालित प्रक्रियाओं के लिए एक अच्छा विचार नहीं है जो स्थिर होने की उम्मीद है।


मुझे यह समाधान पसंद है। एक साथ कई पैकेजों के लिए संक्षिप्त और परीक्षण। इसके अलावा, आप वैकल्पिक जांच को कुछ आसान बना सकते हैं[[ ! -z $MISSING ]] && sudo apt-get install $MISSING
शेनक

3

मैंने पाया है कि उपरोक्त सभी समाधान एक झूठे सकारात्मक उत्पादन कर सकते हैं यदि एक पैकेज स्थापित किया गया है और फिर हटा दिया गया है फिर भी स्थापना पैकेज सिस्टम पर बना हुआ है।

दोहराने के लिए: पैकेज apt-get install curl
निकालें पैकेज निकालेंapt-get remove curl

अब उत्तर के ऊपर परीक्षण करें।

इस स्थिति को हल करने के लिए निम्न आदेश लगता है:
dpkg-query -W -f='${Status}\n' curl | head -n1 | awk '{print $3;}' | grep -q '^installed$'

यह निश्चित रूप से स्थापित या स्थापित नहीं होगा


पूरी तरह से दुख की बात नहीं है - इस मामले में अन्य संभावित परिणाम हैं config-files- इसलिए मुझे लगता है कि | grep -q "installed"कार्यात्मक निकास कोड का दर्जा प्राप्त करने के लिए एक अंतिम वास्तव में आवश्यक है।
उत्सुक

बनाने कि| grep -q '^installed$'
उत्सुक

3

ऐसा लगता है कि आजकल apt-getएक विकल्प है --no-upgradeकि ओपी क्या चाहता है:

--no-upgradeसंकुल का उन्नयन न करें। जब इंस्टॉल के साथ संयोजन में उपयोग किया जाता है, तो नो-अपग्रेड पैकेज को सूचीबद्ध होने से रोकता है अगर वे पहले से ही स्थापित हैं।

से मैनपेज https://linux.die.net/man/8/apt-get

इसलिए आप उपयोग कर सकते हैं

apt-get install --no-upgrade package

और packageस्थापित किया जाएगा केवल अगर यह नहीं है।



2

यह कर देगा। apt-get installउदासीन है।

sudo apt-get install command

5
ऐसे परिदृश्य हैं जिनमें apt-get installएक पैकेज पर करना अवांछनीय है जहां पैकेज पहले से ही स्थापित है, भले ही कमांड खुद ही बेकार हो। मेरे मामले में, मैं एक दूरस्थ सिस्टम पर एक पैकेज स्थापित कर रहा हूं जिसमें अन्सिबल का कच्चा मॉड्यूल है, जो कि अगर मैं apt-get installअंधाधुंध तरीके से चलाता हूं तो हर बार सिस्टम बदल जाएगा । एक सशर्त उस समस्या को हल करता है।
जेंटले जूल

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


1

command-not-foundपैकेज में यह सुविधा पहले से ही उबंटू और डेबियन में मौजूद है ।


15
मैट @ मैट- ubuntu: ~ $ कमांड-नहीं-पाया कमांड-नहीं-पाया: कमांड नहीं मिला ... lol।
मैट फ्लेचर

1
command-not-foundएक इंटरएक्टिव हेल्पर है, न कि यह सुनिश्चित करने के लिए एक उपकरण। बेशक, निर्भरता घोषित करने का उचित तरीका यह है कि आप अपने सॉफ़्टवेयर को डेबियन पैकेज में पैकेज करें और Depends:पैकेज की debian/controlफ़ाइल में घोषणा में ठीक से भरें ।
ट्रिपल जूल

1
apt list [packagename]

dpkg और पुराने apt- * टूल के बाहर इसे करने का सबसे सरल तरीका लगता है


यह मैनुअल जांच के लिए अच्छा है, लेकिन यह एक चेतावनी जारी करता है कि यह उपयुक्त है कि स्क्रिप्टिंग के लिए इरादा नहीं है - एप्ट के विपरीत - * उपकरण।
होन्ताव्री लेवेंट


1

जब मुझे डॉकटर के बजाय स्थानीय रूप से परीक्षण चलाने की आवश्यकता थी, तो मेरी भी ऐसी ही आवश्यकता थी। मूल रूप से मैं केवल किसी भी .deb फ़ाइलों को स्थापित करना चाहता था अगर वे पहले से ही स्थापित नहीं थे।

# If there are .deb files in the folder, then install them
if [ `ls -1 *.deb 2> /dev/null | wc -l` -gt 0 ]; then
  for file in *.deb; do
    # Only install if not already installed (non-zero exit code)
    dpkg -I ${file} | grep Package: | sed -r 's/ Package:\s+(.*)/\1/g' | xargs dpkg -s
    if [ $? != 0 ]; then
        dpkg -i ${file}
    fi;
  done;
else
  err "No .deb files found in '$PWD'"
fi

मुझे लगता है कि उन्हें केवल समस्या है जो मैं देख सकता हूं कि यह पैकेज के संस्करण संख्या की जांच नहीं करता है। यदि .deb फ़ाइल एक नया संस्करण है, तो यह वर्तमान में स्थापित पैकेज को अधिलेखित नहीं करेगा।


1

उबंटू के लिए, उपयुक्त ऐसा करने के लिए एक काफी सभ्य तरीका प्रदान करता है। नीचे Google क्रोम के लिए एक उदाहरण दिया गया है:

apt -qq list google-chrome-stable 2>/dev/null | grep -qE "(installed|upgradeable)" || apt-get install google-chrome-stable

मैं त्रुटि आउटपुट को अशक्त करने के लिए पुनर्निर्देशित कर रहा हूं क्योंकि उपयुक्त इसके "अस्थिर क्ली" का उपयोग करने के खिलाफ चेतावनी देता है। मुझे संदेह है कि सूची पैकेज स्थिर है, इसलिए मुझे लगता है कि इस चेतावनी को दूर फेंकना ठीक है। -Qq उपयुक्त सुपर शांत बनाता है।


1
यह ठीक से काम नहीं करेगा अगर कुछ "अपग्रेड करने योग्य" है
पावेल बारसिक

@PawelBarcik अच्छी बात है। मैंने उस स्थिति को संभालने के लिए जवाब अपडेट कर दिया है।
carlin.scott

0

यह आदेश सबसे यादगार है:

dpkg --get-selections <package-name>

यदि यह इसे प्रिंट करता है:

<पैकेज-नाम> स्थापित करें

अन्यथा यह प्रिंट करता है

कोई संकुल मिलान नहीं मिला <पैकेज-नाम>।

यह Ubuntu 12.04.1 (सटीक पैंगोलिन) पर परीक्षण किया गया था।


4
dpkg --get-selections <package-name>जब पैकेज नहीं मिलता है तो निकास कोड को गैर-शून्य पर सेट नहीं करता है।
लुकास

0

कई बातें बताई गई हैं लेकिन मेरे लिए सबसे सरल तरीका है:

dpkg -l | grep packagename

0

बैश में:

PKG="emacs"
dpkg-query -l $PKG > /dev/null || sudo apt install $PKG

ध्यान दें कि आप पीकेजी में कई पैकेजों के साथ एक स्ट्रिंग हो सकते हैं।


0

मैं निम्नलिखित तरीके का उपयोग करता हूं:

which mySQL 2>&1|tee 1> /dev/null
  if [[ "$?" == 0 ]]; then
                echo -e "\e[42m MySQL already installed. Moving on...\e[0m"
        else
        sudo apt-get install -y mysql-server
                if [[ "$?" == 0 ]]; then
                        echo -e "\e[42mMy SQL installed\e[0m"
                else
                        echo -e "\e[42Installation failed\e[0m"
                fi
        fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.