কোনও প্যাকেজ ইনস্টল রয়েছে কিনা তা নির্ভরযোগ্যভাবে পরীক্ষা করে দেখুন


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পতাকা সহ with খুব নিশ্চিত যে আমি এখানে কিছু ভাল জ্ঞান অনুপস্থিত।

আসলেই কোনও প্যাকেজ ইনস্টল করা আছে কিনা তা নিশ্চিত করতে আমি কী করতে পারি তার কোনও ধারণা আছে?

ধন্যবাদ!


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
এনজোটিব

@ টেমন: আমি যুক্তিটি পরিবর্তন করেছি, কারণ পূর্ববর্তী সমাধানে আমি একটি ত্রুটি পেয়েছি।
এনজোটিব

সাবধান: যদি ব্যাশ ব্যবহার করে এবং পাইপফেইল বিকল্পটি সেট করা থাকে তবে গ্রেপ-কিউ হেইজনব্যাগগুলি তৈরি করতে পারে। মূলত, ডিপি কেজি লেখা শেষ করার আগে গ্রেপ প্রস্থান করে (আপনি সেই ক্ষেত্রে একটি 0 প্রস্থান স্থিতি চান) সুতরাং dpkg পাইপটিতে লিখতে ব্যর্থ হয় (যা পরিবর্তে একটি নন -0 প্রস্থান স্থিতি উত্পন্ন করে)। হয় নিশ্চিত করুন যে পাইপফেল সেট না করা আছে, বা "-কিউ" বিকল্পের দক্ষতা লাভ (সম্ভবত ক্ষুদ্রতম) ত্যাগ করুন।
রন বার্ক

2

আপনি এটি dpkg- কোয়েরি দ্বারা পরীক্ষা করতে পারেন:

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

উল্লেখ্য যে * এবং? ওয়াইল্ডকার্ডগুলি, যদি তারা $ pkg এ প্রদর্শিত হয়। আমার ধারণা, ডিপি কেজি-কোয়েরিটি "ওকে ইনস্টলড" এর পরিবর্তে "পুনরায় ইনস্টল করা আবশ্যক" মুদ্রণ করতে পারে, যদি প্যাকেজটি নষ্ট হয়ে যায় এবং কমান্ড দ্বারা পুনরায় ইনস্টল করা প্রয়োজন হয় 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.