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


11

আমি কীভাবে বাশ স্ক্রিপ্ট তৈরি করতে পারি যা কোনও প্রোগ্রাম ইতিমধ্যে ইনস্টল করা আছে কিনা তা যাচাই করে এবং এটি যদি না হয় তবে এটি ইনস্টল করে?

আপনার সাহায্যের জন্য ধন্যবাদ.

আমার এখন পর্যন্ত কোডটি এখানে:

#/bin/bash

PS3="choose an option"

select opcion in "Installing_Youtube"  "exit"

do

    case $opcion in


        "Installing_Youtube")

            youtube-dl > /usr/bin
            if [ $? -eq 127 ] ; then
                echo "installing youtube"
                 apt-get update
                 apt-get install youtube-dl
                mkdir Videos
            else
                echo "Youtube already installed"
            fi

        ;;


        "exit")
            exit

10
আপনি ওভাররাইট করতে চান /usr/bin?
ডি বেন নোবল

1
আপনি কি প্যাকেজের নাম এবং এক্সিকিউটেবল ফাইলের নামের মধ্যে পার্থক্য করছেন? নাকি দুটোই চেক করতে চান? শুধুমাত্র জর্জের উত্তর বর্তমানে এক্সিকিউটেবলের জন্য যাচাই করে
Xen2050

আপনি এটি পরীক্ষা করতে চান কেন? এই স্ক্রিপ্ট ব্যবহারের উদ্দেশ্য কি?
ব্রায়াম

@ ব্রাইয়াম অন্ততপক্ষে, ইতিমধ্যে ইনস্টল করা প্যাকেজটি ইনস্টল করা যদি এটি অন্য প্যাকেজের নির্ভরতা হিসাবে ইনস্টল করা হয় তবে স্বয়ংক্রিয় থেকে ম্যানুয়ালে তার অবস্থান পরিবর্তন করবে। যদি সেই অন্যান্য প্যাকেজটি পরে মুছে ফেলা হয় তবে এই প্যাকেজটি আর স্বতঃ সরানোর জন্য চিহ্নিত করা হবে না। পূর্ববর্তী ইনস্টল থেকে প্যাকেজগুলির সম্পাদিত তালিকাটি একটি নতুনতে ইনস্টল করার জন্য আমার কাছে একটি স্ক্রিপ্ট রয়েছে। এই কৌশলটি এটিকে নতুন সিস্টেমের বিশৃঙ্খলা তৈরি থেকে বিরত রাখে।
জো

@ জো যা একটি খারাপ সমাধান। পরিবর্তে আপনাকে ইনস্টল করা প্যাকেজগুলির তালিকার সাথে এর apt-mark showmanualপরে এমন কিছু ইনস্টল করা উচিত apt-get install "$(< package.list)"
ব্রায়াম

উত্তর:


11

তুমি এটি করতে পারো:

dpkg -s <packagename> &> /dev/null

তারপরে প্রস্থান স্থিতি পরীক্ষা করুন। উপরের কমান্ডের প্রস্থান স্থিতি 0প্যাকেজটি ইনস্টল থাকলেই হবে

তাই:

   #!/bin/bash

    echo "enter your package name"
    read name

    dpkg -s $name &> /dev/null  

    if [ $? -ne 0 ]

        then
            echo "not installed"  
            sudo apt-get update
            sudo apt-get install $name

        else
            echo    "installed"
    fi

এটা না বাদে? লাইনের সাথে sudo apt install $nameকী হয়েছে? কমান্ডটি পরবর্তী পংক্তিতে যেতে হবে ... অন্যথায়, দুর্দান্ত কাজ ...
ঝাঁনা

3
নোট করুন যে সফ্টওয়্যারটি বিভিন্ন উপায়ে ইনস্টল করা যেতে পারে এবং dpkgএটি কেবল ইনস্টলড ডিবিয়ান প্যাকেজগুলির জন্যই প্রাসঙ্গিক। ওপি'র বিশেষ ক্ষেত্রে youtube-dlউদাহরণস্বরূপ পাইথনের প্যাকেজ ম্যানেজারের মাধ্যমে ইনস্টল করা যেতে পারেpip
সের্গি কলডিয়াজহনি

2
না কেন if dpkg -s “$name” &> /dev/null ; then? একই প্রভাব, ক্লিনার / ক্লিয়ারার ইমো।
ডি বেন নোবল

প্রকৃতপক্ষে, প্রস্থান স্থিতি পরীক্ষা করা ঠিক যা ifহয় ...
Zanna

4

আমি আমার স্ক্রিপ্টগুলিতে যে উদ্দেশ্যে ব্যবহার করি সেই উদ্দেশ্যে এখানে একটি ফাংশন লিখলাম। এটি প্রয়োজনীয় প্যাকেজটি ইনস্টল করা আছে কিনা তা যাচাই করে এবং না হলে ব্যবহারকারীকে এটি ইনস্টল করতে অনুরোধ করে। এটি প্যারামিটার হিসাবে একটি প্যাকেজ নাম প্রয়োজন। আপনি যদি প্যাকেজের নাম জানেন না তবে প্রয়োজনীয় প্রোগ্রামটি অন্তর্ভুক্ত আপনি এটি সন্ধান করতে পারেন। এখানে উপলব্ধ যে তথ্য

function getreq {
dpkg-query --show  "$1"
if [ "$?" = "0" ];
then
    echo "$1" found
else
    echo "$1" not found. Please approve installation.
    sudo apt-get install "$1"
    if [ "$?" = "0" ];
    then echo "$1" installed successfully.
    fi
fi
}

3

কমান্ডের এই লাইনটি whichপ্রোগ্রামটি ব্যবহার করে পরীক্ষা করবে 0এবং ইনস্টল করা থাকলে ফিরে আসবে এবং 1না:

which apache | grep -o apache > /dev/null &&  echo 0 || echo 1

অবশ্যই আপনি এটি আপনার স্ক্রিপ্টে এই পদ্ধতিতে ব্যবহার করবেন:

which "$1" | grep -o "$1" > /dev/null &&  echo "Installed!" || echo "Not Installed!"

একটি সহজ ব্যবহার হবে:

#!/usr/bin/env bash
set -e

function checker() { 
        which "$1" | grep -o "$1" > /dev/null &&  return 0 || return 1 
}

if checker "$1" == 0 ; then echo "Installed"; else echo "Not Installed!"; fi

কয়েকটি জিনিস নোট করুন:

  1. ইনস্টল করার সময় আপনাকে নির্ভরশীল সমস্যাগুলি মোকাবেলা করতে হবে
  2. ইনস্টল করার সময় স্ক্রিপ্টের সাথে মিথস্ক্রিয়া এড়াতে উদাহরণগুলির জন্য এখানে দেখুন ।
  3. আপনি সেই ফাংশন থেকে রিটার্ন মানগুলি ধরতে পারেন এটি ইনস্টল করবেন কিনা তা সিদ্ধান্ত নিতে এটি ব্যবহার করুন।

whichসুপার অ-বহনযোগ্য। আমি এর command -vপরিবর্তে প্রায়শই ব্যবহার করি তবে এটি আপনি যে ধরনের নামটি খুঁজছেন তার উপর খুব বেশি নির্ভর করে (ওরফে, ফাংশন, এক্সিকিউটেবল এবং সি।)
ডি বেন নোবল

একটি উবুন্টু মেশিনের জন্য এমন প্রশ্নের জন্য সুপার অ-বহনযোগ্য? এটি Unix & Linuxসাইট নয় ! আমি যদি Unix & Linuxসাইটে এটির উত্তর দিই তবে তা অন্যরকম হবে!
জর্জ উদোসেন

3

আপনি কেন এটি প্রথম স্থানে পরীক্ষা করতে চান? এটির জন্য যদি আপনার কাছে ভাল কারণ না থাকে তবে এটি করবেন না apt-get install package। যদি এটি ইতিমধ্যে ইনস্টল করা থাকে তবে নতুন সংস্করণ উপলব্ধ থাকলে এটি আপডেট করা হবে, যদি এটি ইনস্টল করা থাকে এবং এটি আপডেট থাকে তবে কিছুই হবে না। আপনার যদি কিছু কনফিগারেশন প্রয়োগ করতে হয় তবে অন্যান্য বিকল্প রয়েছে যেমন একটি কনফিগারেশন প্যাকেজ তৈরি করা যা প্যাকেজের উপর নির্ভর করে বা জবাবদিহির মতো কনফিগারেশন ম্যানেজমেন্ট সফটওয়্যার ব্যবহার করে।


1
কিছু না কিছু ঘটতে পারে: কমপক্ষে অ্যাপ্লিকেশন সহ, ইতিমধ্যে ইনস্টল করা প্যাকেজটি ইনস্টল করা যদি এটি অন্য প্যাকেজের নির্ভরতা হিসাবে ইনস্টল করা হয় তবে স্বয়ংক্রিয় থেকে ম্যানুয়ালে তার অবস্থান পরিবর্তন করে। যদি সেই অন্যান্য প্যাকেজটি পরে মুছে ফেলা হয় তবে এই প্যাকেজটি আর স্বতঃ সরানোর জন্য চিহ্নিত করা হবে না। পূর্ববর্তী ইনস্টল থেকে প্যাকেজগুলির সম্পাদিত তালিকাটি একটি নতুনতে ইনস্টল করার জন্য আমার কাছে একটি স্ক্রিপ্ট রয়েছে। এই কৌশলটি এটিকে নতুন সিস্টেমের বিশৃঙ্খলা তৈরি থেকে বিরত রাখে।
জো

2

ইনস্টল করা প্যাকেজগুলি ব্যবহার করে পরীক্ষা করার একটি সহজ উপায় apt-mark:

apt-mark showinstallইনস্টল চিহ্নিত চিহ্নিত সমস্ত প্যাকেজ তালিকাভুক্ত করবে (ইতিমধ্যে ইনস্টল করা, বা ইনস্টলেশনের জন্য সারিবদ্ধ)। এর পরে, আপনি যে প্যাকেজগুলি (প্যাকেজ) পছন্দ করেন সেগুলি গ্রিপ করার একটি সহজ বিষয়।

উদাহরণ: apt-mark showinstall | grep -q "^$PACKAGE_NAME$" && echo "installed" || echo "not"


আপনি সঠিক পথে আছেন! মিথ্যা ধনাত্মকতা দূর করতে কেবল এটিতে এটি পরিবর্তন করুন: অ্যাপটি-চিহ্ন শোইনস্টল | grep -q "AC $ PACKAGE_NAME E_NAME" && প্রতিধ্বনি "ইনস্টল করা" || প্রতিধ্বনি "না"
এরিক মিন্টজ

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