চলমান প্ল্যাটফর্মটি বাশ স্ক্রিপ্টের সাহায্যে উবুন্টু বা সেন্টোস কিনা তা কীভাবে জানবেন?


39

আমি আমার মেশিনে চলমান লিনাক্স মেশিনের নাম যাচাই করার জন্য আদেশগুলি জানি। উদাহরণ স্বরূপ:

উবুন্টু

cat /etc/version

সেন্টওএস

cat /etc/issue

আমি কীভাবে টার্মিনাল থেকে আউটপুট পেতে পারি এবং তুলনা করব এটি ইউবুন্টু বা সেন্টোস কিনা এবং নীচের কমান্ডগুলি সম্পাদন করব?

apt-get install updates 

অথবা

yum update

উবুন্টু 14.04

cat /etc/issue

2
উবুন্টুকে জিজ্ঞাসা করুন স্বাগতম দয়া করে, আপনি কি
সিলভাইন পিনিউ

উত্তর:


53

দুর্ভাগ্যক্রমে, কোনও বিতরণ নাম পাওয়ার সহজ উপায়, সহজ উপায় নেই। বেশিরভাগ বড় ডিস্ট্রোস এমন একটি সিস্টেমের দিকে এগিয়ে চলেছে যেখানে তারা /etc/os-releaseএই তথ্য সঞ্চয় করতে ব্যবহার করে। বেশিরভাগ আধুনিক বিতরণেও lsb_releaseসরঞ্জামগুলি অন্তর্ভুক্ত থাকে তবে এগুলি সর্বদা ডিফল্টরূপে ইনস্টল হয় না installed সুতরাং, আপনি ব্যবহার করতে পারেন এমন কয়েকটি পদ্ধতি এখানে রইল:

  1. ব্যবহার /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
  2. lsb_releaseউপলব্ধ থাকলে সরঞ্জামগুলি ব্যবহার করুন

    lsb_release -d | awk -F"\t" '{print $2}'
  3. আরও জটিল স্ক্রিপ্ট ব্যবহার করুন যা বিরাট সংখ্যাগরিষ্ঠের জন্য কাজ করা উচিত:

    # Determine OS platform
    UNAME=$(uname | tr "[:upper:]" "[:lower:]")
    # If Linux, try to determine specific distribution
    if [ "$UNAME" == "linux" ]; then
        # If available, use LSB to identify distribution
        if [ -f /etc/lsb-release -o -d /etc/lsb-release.d ]; then
            export DISTRO=$(lsb_release -i | cut -d: -f2 | sed s/'^\t'//)
        # Otherwise, use release info file
        else
            export DISTRO=$(ls -d /etc/[A-Za-z]*[_-][rv]e[lr]* | grep -v "lsb" | cut -d'/' -f3 | cut -d'-' -f1 | cut -d'_' -f1)
        fi
    fi
    # For everything else (or if above failed), just use generic identifier
    [ "$DISTRO" == "" ] && export DISTRO=$UNAME
    unset UNAME
    
  4. gccইনস্টল করা থাকলে সংস্করণ তথ্যটি পার্স করুন :

    CentOS 5.x

    $ gcc --version
    gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
    Copyright (C) 2006 Free Software Foundation, Inc.
    

    CentOS 6.x

    $ gcc --version
    gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
    Copyright (C) 2010 Free Software Foundation, Inc.
    

    উবুন্টু 12.04

    $ gcc --version
    gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
    Copyright (C) 2011 Free Software Foundation, Inc.
    

    উবুন্টু 14.04

    $ gcc --version
    gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
    Copyright (C) 2013 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    

এটি মূলত আমার প্রশ্নের এখানে @ স্ল্যামের দুর্দান্ত উত্তর থেকে সরাসরি অনুলিপি করা হয়েছে


"দুর্ভাগ্যক্রমে, বিতরণের নাম পাওয়ার কোনও নিশ্চিত আগুন, সহজ উপায় নেই।" <— এই সব ক্ষেত্রে নয়। উদাহরণস্বরূপ, সিলভাইন পাইনাউ একটি পাইগনের কাছে পিছনে স্থির করে বর্তমান প্ল্যাটফর্মের প্রকারটি নির্ভরযোগ্যভাবে একটি তুচ্ছ ওয়ান-লাইনার প্রদর্শন করেছিলেন - যা বেশিরভাগ প্ল্যাটফর্মে (উবুন্টু সহ) পূর্বনির্ধারিত আসে comes শেল স্ক্রিপ্টগুলি এই উত্তরটিতে কার্যকরভাবে সাজানো নিম্ন-স্তরের, অ-বহনযোগ্য টেস্টগুলির সাথে প্ল্যাটফর্ম মেটাডেটা ম্যানুয়ালি কোয়েরি করার চেষ্টা করা উচিত নয়
সিসিল কারি

গাওক ডিবিয়ানে ডিফল্টরূপে ইনস্টল করা নেই।
ভিল লইতিলা

@ ভিলাইলটাইলা আমি ভয় করি যে এটি এখানে প্রাসঙ্গিক নয় কারণ এই সাইটটি কেবল উবুন্টু সম্পর্কে। তবে এখানে গোক-নির্দিষ্ট কিছু নেই, সুতরাং awkবা mawkঅন্যান্য বাস্তবায়ন ঠিক তেমন কাজ করবে।
terdon

আরও সুনির্দিষ্ট ব্যবহার করে lsb_release:lsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
নের্ডঅফকোড

আপনি শুধু রিলিজ সংখ্যা চান তাহলে @NerdOfCode, কি lsb_release -d | awk '{print $3}'বা grep -oP 'VERSION="\K\S+' /etc/os-release, awk করতে দুবার নল জন্য কোন প্রয়োজন।
টেরডন

25

এই জাতীয় কাজটি করার জন্য আপনার বাশ লাগবে না এবং আমি /etc/versionএবং /etc/issue(13.10-এ আমার কাছে / ইত্যাদি / সংস্করণ নেই) এর মতো ফাইলগুলি এড়াতে একটি উচ্চ-স্তরের পদ্ধতির ব্যবহারের পরামর্শ দেব ।

সুতরাং আমার সুপারিশটি হ'ল পরিবর্তে এই আদেশটি ব্যবহার করুন:

python -mplatform | grep -qi Ubuntu && sudo apt-get update || sudo yum update

পাইথন প্ল্যাটফর্ম মডিউল উভয় সিস্টেমে কাজ করবে, বাকি কমান্ডটি পরীক্ষা করবে উবুন্টু অজগর দ্বারা ফিরে এসেছে কিনা এবং apt-getঅন্যটি চালাচ্ছে কিনা yum


যোগ -iকরার জন্য grepমে সাহায্যের।
কোয়ানোর

8

এখানে একটি সহজ উত্তর যা আমি উবুন্টু / সেন্টোস / আরএইচইএল এর সমস্ত সংস্করণ জুড়ে কেবলমাত্র ফাইলের উপস্থিতির সাহায্যে কাজ পাই (কোনও ব্যক্তি যদি আপনার উবুন্টু বাক্সগুলিতে এলোমেলোভাবে / ইত্যাদি / রেডহিট-রিলিজ ছেড়ে দিচ্ছে তবে অবশ্যই ব্যর্থ হবে না):

if [ -f /etc/redhat-release ]; then
  yum update
fi

if [ -f /etc/lsb-release ]; then
  apt-get update
fi

আমার উবুন্টুতে কোনও / ইত্যাদি /
এলএসবি

3
আমি -1 যাচ্ছি না, কিন্তু এই উত্তর অন্তত একটি ক্ষেত্রে সঠিক নয়: /etc/lsb-releaseCloudLinux (সেন্টওএস) বিদ্যমান 6.8 তাই এটি উভয় ফিরে আসবে yumএবং apt-get
ধাপিন

5

এই কাজের জন্য শেফ ব্যবহার করুন । ;-)

শেফে, আপনি এই platform?পদ্ধতিটি ব্যবহার করতে পারেন :

if platform?("redhat", "centos", "fedora")
  # Code for only Red Hat Linux family systems.
end

বা:

if platform?("ubuntu")
  # Code for only Ubuntu systems
end

বা:

if platform?("ubuntu")
  # Do Ubuntu things
end

বা:

if platform?("freebsd", "openbsd")
  # Do BSD things
end

1
যদিও demonstrably উচ্চতর নিম্নস্তরের শেল-কেন্দ্রিক ভঙ্গুর অ সমাধান (যেমন, lsb_release, /etc/os-release), এই সমাধান পাচক বা রাঁধুনি প্রয়োজন স্বতন্ত্র অসুবিধা আছে - একটি হেভিওয়েট ইনফ্রাস্ট্রাকচার কোড (IAC) হিসাবে ফ্রেমওয়ার্ক না সবচেয়ে প্ল্যাটফর্মের উপর ডিফল্ট এবং ব্যবহার পদ্ধতির মাধ্যমে আরো ইনস্টল নিজস্ব ডোমেন-নির্দিষ্ট ভাষা (ডিএসএল)। সংক্ষেপে, অধিকাংশ ব্যবহারকারীর সম্ভবত শুধু চাই পাইথন যাও মুলতবি , যা করা হয় শেল স্ক্রিপ্টিং সঙ্গে ভাল (উবুন্টু সহ) সবচেয়ে প্ল্যাটফর্মের এবং ইন্টারফেস ডিফল্টরূপে ইনস্টল করা নেই।
সিসিল কারি

5

কার্নেলের নামে উবুন্টু পরীক্ষা করুন:

if [  -n "$(uname -a | grep Ubuntu)" ]; then
    sudo apt-get update && sudo apt-get upgrade 
else
    yum update
fi  

4
 apt-get -v &> /dev/null && apt-get update
 which yum &> /dev/null && yum update

যদি কেবল দু'টি ডিস্ট্রো থাকে তবে আপনি এটি আরও খাটো করে তুলতে পারেন:

apt-get -v &> /dev/null && apt-get update || yum update

কোনওভাবে yum -vসেন্টোস-এ শূন্য -হীন ফিরে আসুন whichপরিবর্তে ব্যবহার করুন,
অবশ্যই whichইনস্টলড না থাকলে অবশ্যই আপনার পরিস্থিতি বিবেচনা করা উচিত ।


2

নিম্নলিখিত লিপিটি উবুন্টু কিনা তা জানা উচিত। যদি এটি না হয় এবং আপনার কাছে কেবলমাত্র অন্য বিকল্পটি হ'ল সেন্টোস, আপনার এটি একটি ধারাতে থাকা উচিত else:

dist=`grep DISTRIB_ID /etc/*-release | awk -F '=' '{print $2}'`

if [ "$dist" == "Ubuntu" ]; then
  echo "ubuntu"
else
  echo "not ubuntu"
fi

1
এটি সম্ভবত lsb_releaseসরঞ্জামটি ব্যবহার করে সরল করা যেতে পারে , যা একই ফাইলগুলি পড়তে হবে। lsb_release -iহয় Distributor ID: Ubuntuবা Distributor ID: CentOSএই ক্ষেত্রে রিপোর্ট ।
ক্রোনাইটিস

@ ক্রোনাইটিস: হ্যাঁ, অবশ্যই এটি হতে পারে
जॉব 2'14

আমার মনে হয় না এটি সেন্টোসে যদিও এটি ডিফল্টরূপে পাওয়া গেছে
সিলভাইন পাইনাউ

1

/etc/os-releaseএকটি সাব শেল এক্সিকিউট করুন এবং এর মান প্রতিধ্বনি:

if [ "$(. /etc/os-release; echo $NAME)" = "Ubuntu" ]; then
  apt-get install updates 
else
  yum update
fi

0

আমি পাইথন ব্যবহার করতাম

if ! python -c "exec(\"import platform\nexit ('centos' not in platform.linux_distribution()[0].lower())\")" ; then
   echo "It is not CentOS distribution, ignoring CentOS setup"
   exit 0
fi

0

এই কমান্ডটি সেন্টোস, উবুন্টু এবং ডেবিয়ান-এ কাজ করে: grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'

ডেবিয়ান এ ফলন দেয় Debian GNU/Linux, উবুন্টুতে এটি দেয় Ubuntuএবং সেন্টোসে ফলন হয় CentOS Linux

গাওকের পরিবর্তে গ্রেপ, কাট এবং সেড ব্যবহারের সুবিধাটি স্পষ্ট: দেবিয়ান ডিফল্টরূপে গাক ইনস্টল করে না, সুতরাং আপনি এলোমেলো ডেবিয়ান বাক্সে নির্ভর করতে পারবেন না।

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