কোনও প্যাকেজ এপিটিতে ইনস্টল করা আছে কিনা তা পরীক্ষা করুন


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 যেমন আপনার লিঙ্কযুক্ত পোস্টটি কাজের জন্য সবচেয়ে সঠিক সরঞ্জাম বলে মনে হয়, যেমন একটি স্ক্রিপ্টিং প্রসঙ্গে এপিটি সিস্টেমে সরাসরি আবদ্ধ পাইথন লাইব্রেরিগুলি ব্যবহার না করে।

সহ 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এটি সাধারণত পর্যাপ্ত (এবং মনে রাখা সহজ)।
phogg

1
@ ফোগ: হ্যাঁ, এটি কোনও স্ক্রিপ্টে বাস করার কথা কিনা তা নির্ভর করে। এছাড়াও, dpkg-query -lআউটপুটটি পাথরের মধ্যে সেট করা হয়নি কারণ এটি কেবলমাত্র একটি ব্যবহারকারী উপস্থাপনা মোড, সুতরাং যদি উপস্থাপনাটি পরিবর্তন হয় তবে সম্ভবত এই জাতীয় স্ক্রিপ্টটি নষ্ট হবে।
ড্যানিয়েল অ্যান্ডারসন

@Daniel। আমি রিটার্ন কোড পদ্ধতির পছন্দ করি। কোডে বিশদ সহ আমার উত্তর দেখুন।
tahoar

10.04-এ ফর্ম্যাট বিকল্পটি ডিবি: স্থিতি-সংক্ষেপের উপস্থিতি মনে হয় না - আমি ব্যবহার করেছি: dpkg-query -Wf'${Version}' ${pkg} 2>/dev/null | grep -q '^\d*'একই প্রভাব।
scottynomad

1

এই ফলাফলগুলির সাথে আমি তিনটি প্যাকেজের উপরে ড্যানিয়েলের পরামর্শগুলি পরীক্ষা করেছি:

  1. নেটিভ দেবিয়ান সংগ্রহস্থল প্যাকেজ ইনস্টল করা নেই:

    ~$ dpkg-query -Wf'${db:Status-abbrev}' apache-perl
    ~$ echo $?
    1
    
  2. পিপিএ প্যাকেজ হোস্টে নিবন্ধিত এবং ইনস্টল করা:

    ~$ dpkg-query -Wf'${db:Status-abbrev}' libreoffice
    ~$ echo $?
    0
    
  3. পিপিএ প্যাকেজ হোস্টে নিবন্ধভুক্ত তবে ইনস্টল করা হয়নি:

    ~$ 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আপনার পেস্টের অংশটি মিস করেছেন । আমি আপনার সমস্যাটিকে সত্যই পুনরুত্পাদন করতে পারি না তবে এটি হতে পারে কারণ কোড উদাহরণগুলি বর্তমানে অসম্পূর্ণ, তাই দয়া করে এটি ঠিক করুন। আপনি কি দেবিয়ান বা উবুন্টু চালান?
ড্যানিয়েল অ্যান্ডারসন

আমি উবুন্টু 10.04 চালাচ্ছি (পিপিএর সমর্থিত কোনও সোজা দেবিয়ান নয়?) আমার কোডটি আপনার গ্রেপটি বাদ দিয়েছে কারণ 1) dkpg- কোয়েরি কমান্ড স্টাডআউটকে কিছুই লেখায় না এবং গ্রেপ সবসময় একটি রিটার্নকোড ফেলে দেয়। ইনস্টল করা থাকলে dpkg- কোয়েরি রিটার্নকোড 0 হয়।
tahoar

2
1. আপনার পোস্টটি "দেবিয়ান" তখন ট্যাগ করবেন না। ২. আমি মনে করি না আপনি grepকমান্ডের যে অংশটি অভিনয় করেছেন তা বুঝতে পেরেছেন , তাই আপনি এটি ছিনিয়ে নিয়েছেন, এবং এখন আপনি বলছেন এটি কার্যকর হয় না? grep -qরিটার্ন কোড দেয় 1যদি এটি না মেলে, IE প্রোগ্রাম না ইনস্টল বা অনুপলব্ধ, বা 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

আমি ড্যানিয়েল অ্যান্ডারসনের উত্তরটি পছন্দ করি তবে এটি আমার পক্ষে কার্যকর হয়নি। আমি উবুন্টু 12.04 এ আছি।

থেকে dpkg man পৃষ্ঠা , 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 এর পুরানো সংস্করণে কাজ করার জন্য ড্যানিয়েল অ্যান্ডারসনের উত্তরকে পুরোপুরি খাপ খাইয়ে নিতে, এবং এইভাবে বয়স্ক উবুন্টু ডিস্ট্রোস:

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

রিটার্নস:

  • 0 - প্যাকেজ ইনস্টল করা হয়েছে, বা
  • 1 - প্যাকেজ ইনস্টল করা নেই।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.