বাশ স্ক্রিপ্ট থেকে কীভাবে ওএস সনাক্ত করবেন?


524

আমি আমার .bashrcএবং .bash_loginফাইলগুলি সংস্করণ নিয়ন্ত্রণে রাখতে চাই যাতে আমি সেগুলি আমার ব্যবহৃত সমস্ত কম্পিউটারের মধ্যে ব্যবহার করতে পারি। সমস্যাটি হ'ল আমার কিছু ওএস নির্দিষ্ট এলিয়াস রয়েছে তাই আমি স্ক্রিপ্টটি ম্যাক ওএস এক্স, লিনাক্স বা সাইগউইনে চলছে কিনা তা নির্ধারণের জন্য একটি উপায় খুঁজছিলাম ।

বাশ স্ক্রিপ্টে অপারেটিং সিস্টেম সনাক্ত করার সঠিক উপায় কী ?


1
আপনি কি কখনও আপনার কনফিগারগুলি ভাগ করে নেওয়ার কথা বিবেচনা করেছেন? আমি একই ধরণের সেটআপ পেতে
চাইছিলাম

@sorin আমি জানি এটা একটি পুরানো মন্তব্য, কিন্তু যদি এখনও জানতে আগ্রহী, আমি বিল্ডিং করে থাকেন ProfileGem যা আপনি আপনার সমস্ত মেশিনের জন্য প্লাগেবল ব্যাশ পরিবেশের কনফিগার করতে দেয়।
ডিমো 414

1
@ dimo414 profilegem এখানে সরানো হয়েছে বলে মনে হয় bitbucket.org/dimo414/profilegem । সাধারণভাবে ব্যাশ কনফিগারেশনগুলি ভাগ করে নেওয়ার ক্ষেত্রে, এই কয়েকটি ডটফিলস
mahemoff

1
@ মাহমোফ আপডেট হওয়া লিঙ্কটির জন্য ধন্যবাদ, দুঃখিত আমি আমার মন্তব্য সম্পাদনা করতে পারছি না। আপনি প্রোফাইল জিমে পরীক্ষা নিরীক্ষা করলে আমি প্রতিক্রিয়া বা বাগগুলি স্বাগত জানাব!
dimo414

হায়রে BitBucket Mercurial সমর্থন নিচে বাঁক হয়, তাই আমি আমার লিংক আবার আপডেট করতে নেই :( github.com/dimo414/ProfileGem নতুন হোম।
dimo414

উত্তর:


520

আমি মনে করি নিম্নলিখিত কাজ করা উচিত। আমি win32যদিও সম্পর্কে নিশ্চিত না ।

if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        # ...
elif [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac OSX
elif [[ "$OSTYPE" == "cygwin" ]]; then
        # POSIX compatibility layer and Linux environment emulation for Windows
elif [[ "$OSTYPE" == "msys" ]]; then
        # Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
elif [[ "$OSTYPE" == "win32" ]]; then
        # I'm not sure this can happen.
elif [[ "$OSTYPE" == "freebsd"* ]]; then
        # ...
else
        # Unknown.
fi

7
উইন্ডোজে আপনি msysগিট বাশ / এমএসজিজিট এবং সাইগউইনের cygwinজন্য পাবেন
ফ্রাইডারব্লিউমলে

1
উইন্ডোজের জন্য কীভাবে সনাক্ত করা যায় সহ এই উত্তরটি ভাল। আমিও Mingw32 ব্যবহার করছি এবং এটি হিসাবে আসে আপmsys
d48

2
আকর্ষণীয় .. ম্যাক ওএসএক্স এখনও 'ডারউইন' দেবে।
জোনাথনবেল

6
এমন কিছু যা আমাকে ট্রিপ করেছে, যখন আপনি মন্তব্যটি কোনও আদেশের সাথে প্রতিস্থাপন করেন - তার সাথে শেষ হওয়ার বিষয়টি নিশ্চিত করুন ;
ভাদিম পেরেটোকিন

1
আমি যখন একটি কমান্ড যুক্ত করি তখন আমি source somefile ; পাই syntax error near unexpected token elif
অরফিশ

291

আমার .bashrc এর জন্য, আমি নিম্নলিখিত কোডগুলি ব্যবহার করছি:

platform='unknown'
unamestr=`uname`
if [[ "$unamestr" == 'Linux' ]]; then
   platform='linux'
elif [[ "$unamestr" == 'FreeBSD' ]]; then
   platform='freebsd'
fi

তারপরে আমি কিছু কিছু করি:

if [[ $platform == 'linux' ]]; then
   alias ls='ls --color=auto'
elif [[ $platform == 'freebsd' ]]; then
   alias ls='ls -G'
fi

এটি কুৎসিত, কিন্তু এটি কার্যকর। আপনি যদি চান তবে এর caseপরিবর্তে আপনি ব্যবহার করতে পারেন if


6
আপনি কেবল আনমেস্টার ব্যবহারের পরিবর্তে কেন আনমাস্টার থেকে প্ল্যাটফর্ম সেট করেন?
csexton

80
ব্যাকটিক্স ব্যবহার করবেন না, আরও পরিষ্কার ক্লিয়ারার সিনট্যাক্স ব্যবহার করুন: "আনামেস্টার = $ (একচেটিয়া)"।
বিনোদন

14
তাত্ক্ষণিকভাবে, ব্যাকটিকগুলি কোনও স্ট্রিংয়ের অনুরূপ হতে পারে।
হ্যারিসন পাওয়ারস

29
@ ডেভিড-উইনিস্কি কারণ আপনার যদি নীড়ের কমান্ড যেমন $ (কমান্ড -১ $ (কমান্ড -২)) প্রয়োজন হয়
মাইকেল বার্টন

3
এটি করা কি আরও ভাল হবে না: platform="$(uname | tr '[:upper:]' '[:lower:]')"এবং তারপরে অবশ্যই কোনও ক্ষেত্রে পরিচালনা করবেন? খুব নির্দিষ্ট আউটপুটের উপর নির্ভরশীলতা হার্ডকোড করা কেবল অদ্ভুত বলে মনে হচ্ছে।
ব্র্যান্ডন বাক

274

বাশ ম্যানপেজটি বলে যে চলক OSTYPE অপারেশন সিস্টেমের নাম সংরক্ষণ করে:

OSTYPEস্বয়ংক্রিয়ভাবে স্ট্রিংয়ে সেট করুন যা অপারেটিং সিস্টেমটি বর্ণনা করে যার উপর ব্যাশ চালাচ্ছে। ডিফল্টটি সিস্টেম-নির্ভর।

এটি এখানে সেট করা linux-gnuআছে।


5
এছাড়াও, ma OSTYPE আমার ম্যাকের (চিতাবাঘ) ও 'সাইগউইন'-তে সাইগউইনের অধীনে' ডারউইন ৯.০ '।
ডিএফ।

5
Snow OSTYPE স্নোলিওপার্ডে ডারউইন 10.0। ডাব্লুটিএফ যুক্ত সংস্করণ যুক্ত হয়েছে? একটি সাধারণ কেস স্টেটমেন্ট কাজ করবে না মানে।
এমএক্সসিএল

16
এটি অপসারণ করা কোনও এত বড় চুক্তি নয়:os=${OSTYPE//[0-9.]/}
আব্বা

86
case $OSTYPE in darwin*) echo I am a Mac ;; esac
ট্রিপলি

36
@ ট্রিপলি বা এমন লোকদের জন্য যারা "যদি" সিনট্যাক্সের সাথে আরও স্বাচ্ছন্দ্যযুক্ত হন:if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
রিকান

157

$OSTYPE

আপনি কেবল প্রাক-সংজ্ঞায়িত $OSTYPEভেরিয়েবল ব্যবহার করতে পারেন যেমন:

case "$OSTYPE" in
  solaris*) echo "SOLARIS" ;;
  darwin*)  echo "OSX" ;; 
  linux*)   echo "LINUX" ;;
  bsd*)     echo "BSD" ;;
  msys*)    echo "WINDOWS" ;;
  *)        echo "unknown: $OSTYPE" ;;
esac

তবে এটি পুরানো শেল (যেমন বোর্ন শেল ) দ্বারা স্বীকৃত নয়


uname

আর একটি পদ্ধতি হ'ল unameকমান্ডের উপর ভিত্তি করে প্ল্যাটফর্ম সনাক্ত করা ।

নিম্নলিখিত স্ক্রিপ্ট দেখুন (.Bashrc অন্তর্ভুক্ত প্রস্তুত):

# Detect the platform (similar to $OSTYPE)
OS="`uname`"
case $OS in
  'Linux')
    OS='Linux'
    alias ls='ls --color=auto'
    ;;
  'FreeBSD')
    OS='FreeBSD'
    alias ls='ls -G'
    ;;
  'WindowsNT')
    OS='Windows'
    ;;
  'Darwin') 
    OS='Mac'
    ;;
  'SunOS')
    OS='Solaris'
    ;;
  'AIX') ;;
  *) ;;
esac

আপনি আমার মধ্যে কিছু ব্যবহারিক উদাহরণ খুঁজে পেতে পারেন.bashrc


এখানে ট্র্যাভিস সিআই- তে অনুরূপ সংস্করণ ব্যবহৃত হয়েছে :

case $(uname | tr '[:upper:]' '[:lower:]') in
  linux*)
    export TRAVIS_OS_NAME=linux
    ;;
  darwin*)
    export TRAVIS_OS_NAME=osx
    ;;
  msys*)
    export TRAVIS_OS_NAME=windows
    ;;
  *)
    export TRAVIS_OS_NAME=notset
    ;;
esac

1
$ OSTYPE চেকটি সাইগউইনের জন্য একটি শাখা হারিয়েছে, যা উইন্ডোজ মেশিনকে নির্দেশ করবে। অগম চেকটি সঠিকভাবে কাজ করবে না, সাইগউইন আনমে "CYGWIN_NT-10.0" রিটার্ন দেয় এবং MinGW এ uname "MINGW64_NT-10.0" প্রদান করে।
ম্যাট পেনিংটন

1
ওরফে ম = '/ বিন / ম -G' আসলে ওএস ভিত্তিক ফ্যাগস প্রেক্ষাপটে দেখতে নিরাপদ বিকল্প, superuser.com/a/1299969/84662
আন্দ্রেই Neculau

আমি ব্যবহার করার পরামর্শ দিচ্ছি uname, ওরাকল কনভেনশনকে সজ্জিত করেছেন এবং তাদের সাথে একটি ফ্রি সংস্করণ স্ট্রিং রেখেছেন OSTYPE ==> solaris2.11unameকিছুটা ক্লিনার এবং করা কম কাজ।
হবে

37

সনাক্ত করা অপারেটিং সিস্টেম এবং CPU- র টাইপ এত সহজ করতে নয় portably । আমার আছে একটিsh প্রায় 100 টি লাইনের স্ক্রিপ্ট রয়েছে যা ইউনিক্স প্ল্যাটফর্মগুলির বিস্তৃত বিভিন্ন জুড়ে কাজ করে: আমি 1988 সাল থেকে যে কোনও সিস্টেম ব্যবহার করেছি।

মূল উপাদানগুলি হ'ল

  • uname -pহয় প্রসেসরের ধরনের কিন্তু সাধারণত unknownআধুনিক ইউনিক্স প্ল্যাটফর্মের উপর।

  • uname -m কিছু ইউনিক্স সিস্টেমে "মেশিন হার্ডওয়্যার নাম" দেবে।

  • /bin/archযদি এটি বিদ্যমান থাকে তবে সাধারণত প্রসেসরের ধরণ দেবে।

  • uname কোনও যুক্তি ছাড়াই অপারেটিং সিস্টেমটির নাম দেবে।

অবশেষে আপনাকে প্ল্যাটফর্মগুলির মধ্যে পার্থক্যগুলি এবং কীভাবে সূক্ষ্ম করতে চান সে সম্পর্কে আপনাকে ভাবতে হবে উদাহরণ হিসেবে বলা যায়, শুধু কিছু সহজ রাখা, আমি চিকিত্সা i386মাধ্যমে i686কোন, "Pentium* " এবং যে কোনও " AMD*Athlon*" হিসাবে এরx86

আমার ~/.profileপ্রারম্ভকালে একটি স্ক্রিপ্ট চালায় যা একটি স্ট্রিংয়ের জন্য একটি ভেরিয়েবল সেট করে যা সিপিইউ এবং অপারেটিং সিস্টেমের সংমিশ্রণ নির্দেশ করে। আমি প্ল্যাটফর্ম-নির্দিষ্ট আছে bin, man, lib, এবং includeউপর ভিত্তি ডিরেক্টরি যে সেট আপ করুন। তারপরে আমি এনভায়রনমেন্ট ভেরিয়েবলের একটি বোতললোড সেট করি। উদাহরণস্বরূপ, মেলটি পুনরায় ফর্ম্যাট করার জন্য একটি শেল স্ক্রিপ্ট কল করতে পারে, উদাহরণস্বরূপ, $LIB/mailfmtযা প্ল্যাটফর্ম নির্দিষ্ট এক্সিকিউটেবল বাইনারি।

আপনি অপকৃষ্টভাবে করতে চান , uname -mএবং প্লেইন unameআপনাকে বলতে হবে তুমি কি অনেক প্ল্যাটফর্মের উপর জানতে চাই। আপনার প্রয়োজন হলে অন্যান্য জিনিস যুক্ত করুন। (এবং ব্যবহার করুন case, নেস্টেড নয় if!)


2
আনম কমান্ড অনুসারে , প্যারামিটার ব্যতীত আনামে "-s" প্যারামিটার ব্যবহারের সমতুল্য: "-স সিস্টেমের নামটি প্রদর্শন করে This এই পতাকাটি ডিফল্টরূপে চালু আছে" " সুস্পষ্ট হওয়ার জন্য কেউ "আনমেমে" পরিবর্তে "আনমেমেস" ব্যবহার করতে পারে। ( 'শেল আউটপুট সহায়তা' এর উত্তরে কিছুটা বিশদভাবে বর্ণনা করেছেন )
পিটার মর্টেনসেন

ওএস এবং প্রসেসরের আর্কিটেকচারকে নির্ভরযোগ্যভাবে সনাক্ত করার জন্য আপনার এই 100 স্ক্রিপ্টের সাথে গিথুব গিট বা পেস্টবিনের কোনও লিঙ্ক রয়েছে?
অ্যান্ড্রু ডি আন্দ্রেড

4
@ অ্যান্ড্রুড্রেআরান্দে জনগণের কাছে এই কোডটি প্রকাশ করতে আমি লজ্জা পাচ্ছি। পেস্টবিন.com
নর্মন রামসে

তাহলে কেমন uname -s?
আলেকজান্ডার মিলস

35

আমি এই সম্পূর্ণ ব্যাশ কোডটি ব্যবহার করার পরামর্শ দিচ্ছি

lowercase(){
    echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
}

OS=`lowercase \`uname\``
KERNEL=`uname -r`
MACH=`uname -m`

if [ "{$OS}" == "windowsnt" ]; then
    OS=windows
elif [ "{$OS}" == "darwin" ]; then
    OS=mac
else
    OS=`uname`
    if [ "${OS}" = "SunOS" ] ; then
        OS=Solaris
        ARCH=`uname -p`
        OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
    elif [ "${OS}" = "AIX" ] ; then
        OSSTR="${OS} `oslevel` (`oslevel -r`)"
    elif [ "${OS}" = "Linux" ] ; then
        if [ -f /etc/redhat-release ] ; then
            DistroBasedOn='RedHat'
            DIST=`cat /etc/redhat-release |sed s/\ release.*//`
            PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/SuSE-release ] ; then
            DistroBasedOn='SuSe'
            PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
            REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
        elif [ -f /etc/mandrake-release ] ; then
            DistroBasedOn='Mandrake'
            PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/debian_version ] ; then
            DistroBasedOn='Debian'
            DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F=  '{ print $2 }'`
            PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F=  '{ print $2 }'`
            REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F=  '{ print $2 }'`
        fi
        if [ -f /etc/UnitedLinux-release ] ; then
            DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
        fi
        OS=`lowercase $OS`
        DistroBasedOn=`lowercase $DistroBasedOn`
        readonly OS
        readonly DIST
        readonly DistroBasedOn
        readonly PSUEDONAME
        readonly REV
        readonly KERNEL
        readonly MACH
    fi

fi

আরও উদাহরণ উদাহরণ এখানে: https://github.com/coto/server-easy-install/blob/master/lib/core.sh


1
আপনি ছোট হাতের কাজটি ছেড়ে গেছেন, আমি আপনার উত্তরটি আপনার জন্য আপডেট করেছি।
রবিন ক্লাওয়ার্স

1
একবার আপনি এটি লিনাক্স জানলে, আপনি যদি কেবল চারপাশে ঝাঁকুনি দিচ্ছেন (সন্ধানের স্বয়ংক্রিয় চেষ্টা করার চেষ্টা করছেন না) মনে হচ্ছে এটি সহজ সরল পদক্ষেপ কেবল ls /etc"ব্লাহ-রিলিজ" সন্ধান করা - ব্লাহ যাই হোক না কেন, এটি লিনাক্স ওএস - সেন্টোস, উবুন্টু , ইত্যাদি
ক্রিস মোসচিনি

আমি সম্পাদনা করেছি কারণ ওএস ভেরিয়েবলের কিছু উল্লেখ "$ $ OS}" হিসাবে লেখা হয়েছিল আমি তাদেরকে "{{OS}" এ পরিবর্তন করেছিলাম এটিই সঠিক পথ, আমি এটি পরীক্ষা করেছি
বাজ

আপনি কি স্ক্রিপ্টের একেবারে শেষে "প্রতিধ্বনি {{OS}" যুক্ত করার বিষয়টি বিবেচনা করবেন?
ওলেগ কোকরিন

10

ব্যাশে, নথি হিসাবে ব্যবহার করুন $OSTYPEএবং $HOSTTYPE; এই আমি কি কি. যদি এটি পর্যাপ্ত না হয় এবং এমনকি unameবা uname -a(বা অন্যান্য উপযুক্ত বিকল্প) পর্যাপ্ত তথ্য না দেয় তবে জিএনইউ প্রকল্পের কনফিগার.গুয়েস স্ক্রিপ্টটি সর্বদা এই উদ্দেশ্যে করা হয়।


10

আমি এই উত্তরগুলি কিছু এড়ানোর পরামর্শ দেব। ভুলে যাবেন না যে আপনি স্ট্রিং তুলনা অন্যান্য ফর্ম চয়ন করতে পারেন, যা বেশিরভাগ বৈকল্পিক বা প্রস্তাবিত কুশল কোড সাফ করবে।

এর মধ্যে একটি সমাধান হ'ল একটি সহজ চেক, যেমন:

if [[ "$OSTYPE" =~ ^darwin ]]; then

সংস্করণ প্রত্যয় সত্ত্বেও ডারউইনের যে কোনও সংস্করণ মেলাতে এটির অতিরিক্ত সুবিধা রয়েছে। এটি Linuxপ্রত্যাশার যে কোনও পরিবর্তনের জন্যও কাজ করে ।

আপনি আমার ডটফাইলে কিছু অতিরিক্ত উদাহরণ এখানে দেখতে পারেন


9

"Uname" ব্যবহার করার চেষ্টা করুন। উদাহরণস্বরূপ, লিনাক্সে: "uname -a"।

ম্যানুয়েল পৃষ্ঠা মতে, SVr4 এবং POSIX করার uname কনর্ফাম, তাই এটি ম্যাক OS X এবং এর পাওয়া উচিত Cygwin খুব, কিন্তু আমি যে নিশ্চিত করতে পারবে না।

বিটিডাব্লু: $ OSTYPE এছাড়াও linux-gnuএখানে সেট করা আছে :)


প্যারামিটার ব্যতীত ম্যাক ওএস এক্স (চিতাবাঘ) এ 'ডারউইন' আনমনে প্রিন্ট করে। -এর সাহায্যে এটি অতিরিক্ত প্রচুর তথ্য মুদ্রণ করে (কার্নেলের সংস্করণ, আর্কিটেকচার এবং অন্য কিছু যা আমি বুঝতে পারি না)। আমি সাইগউইন
ডেভিড রদ্রিগেজ - ড্রিবাস

8

আমি এই শর্করা আমার লিখেছেন .bashrc:

if_os () { [[ $OSTYPE == *$1* ]]; }
if_nix () { 
    case "$OSTYPE" in
        *linux*|*hurd*|*msys*|*cygwin*|*sua*|*interix*) sys="gnu";;
        *bsd*|*darwin*) sys="bsd";;
        *sunos*|*solaris*|*indiana*|*illumos*|*smartos*) sys="sun";;
    esac
    [[ "${sys}" == "$1" ]];
}

সুতরাং আমি এই জাতীয় জিনিসগুলি করতে পারি:

if_nix gnu && alias ls='ls --color=auto' && export LS_COLORS="..."
if_nix bsd && export CLICOLORS=on && export LSCOLORS="..."
if_os linux && alias psg="ps -FA | grep" #alternative to pgrep
if_nix bsd && alias psg="ps -alwx | grep -i" #alternative to pgrep
if_os darwin && alias finder="open -R"

বিটিডাব্লু, এই 9 টি লাইন সবচেয়ে বেশি যে কোনও চলমান বাশ নিয়ে কাজ করে। কোনও শেলআউট এবং ব্যক্তিগত .bashrc এর প্রায় কোনও স্টাইলের সাথে কাজ করে না (বড় / নেস্টেড যদি / কেস ট্রি বা প্রচুর এলোমেলো উপকরণ)। আইএমও, উপরের প্রতিটি উত্তর প্যান্টগুলিকে মারধর করে।
কেফিক্স

এখনও অবধি, সাইগউইন এবং অন্যান্য বিএসডি (মূলত জনপ্রিয় * এনআইএক্সের সংকলন)
হিদেকাএআই

আজ প্রাসঙ্গিক এবং বাশ চালান যে ব্যবহারকারীর দেশগুলির জন্য সম্পূর্ণ। , AIX / এইচপি-ইউএক্স / IRIX ব্যবহৃত / OpenVMS ব্যবহারকারীদের ঐকতান পারে। লিনাক্সের জন্য নতুন Windows সাবসিস্টেম উবুন্টু AMD64 একটি স্টক ইনস্টল করুন যাতে এটি জন্য উভয় সত্য ফিরে উচিত রান if_nix gnu& if_os linux
কেফিক্স

1
@kfix হ্যাঁ যে ঠিক আছে, জয় 10 ব্যাশ সাব-সিস্টেম আউটপুট জন্য "লিনাক্স-GNU" এর echo $OSTYPE। 10 টি বাশ সাব সিস্টেমটি বিশেষত জিত সনাক্ত করতে, আমি খুঁজে পেয়েছি একমাত্র সমাধান "মাইক্রোসফ্ট" এর জন্য যাচাই করা/proc/sys/kernel/osrelease
Jpnh


7

আমি একটি ব্যক্তিগত বাশ লাইব্রেরি এবং স্ক্রিপ্টিং ফ্রেমওয়ার্ক লিখেছিলাম যা GNU shtool ব্যবহার করে বরং সঠিক প্ল্যাটফর্ম সনাক্তকরণ করতে পারে।

GNU shtool স্ক্রিপ্টগুলির একটি খুব বহনযোগ্য সেট যা অন্যান্য দরকারী জিনিসগুলির মধ্যে 'shtool প্ল্যাটফর্ম' কমান্ড ধারণ করে। এখানে ফলাফল:

shtool platform -v -F "%sc (%ac) %st (%at) %sp (%ap)"

কয়েকটি ভিন্ন মেশিনে:

Mac OS X Leopard: 
    4.4BSD/Mach3.0 (iX86) Apple Darwin 9.6.0 (i386) Apple Mac OS X 10.5.6 (iX86)

Ubuntu Jaunty server:
    LSB (iX86) GNU/Linux 2.9/2.6 (i686) Ubuntu 9.04 (iX86)

Debian Lenny:
    LSB (iX86) GNU/Linux 2.7/2.6 (i686) Debian GNU/Linux 5.0 (iX86)

এটি দেখতে পাবেন হিসাবে বেশ সন্তোষজনক ফলাফল। GNU shtool কিছুটা ধীর গতির, তাই আমি আসলে আমার স্ক্রিপ্টগুলিতে কল করে এমন একটি সিস্টেমে প্ল্যাটফর্ম সনাক্তকরণটি সংরক্ষণ এবং আপডেট করি। এটি আমার কাঠামো, যাতে এটি আমার পক্ষে কাজ করে তবে আপনার মাইলেজটি ভিন্ন হতে পারে।

এখন, আপনাকে আপনার স্ক্রিপ্টগুলির সাথে shtool প্যাকেজ করার একটি উপায় খুঁজে পেতে হবে, তবে এটি কোনও কঠোর অনুশীলন নয়। আপনি সর্বদা অনাদায়ী আউটপুট এ ফিরে যেতে পারেন।

সম্পাদনা করুন:

আমি টেডির পোস্টটি মিস করেছি config.guess(কোনওভাবে)। এগুলি খুব অনুরূপ স্ক্রিপ্ট, তবে একই নয়। আমি ব্যক্তিগতভাবে অন্যান্য ব্যবহারের জন্যও shtool ব্যবহার করি এবং এটি আমার পক্ষে বেশ ভালভাবে কাজ করছে।


7

আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

OS=$(uname -s)

তারপরে আপনি আপনার স্ক্রিপ্টে ওএস ভেরিয়েবল ব্যবহার করতে পারেন।


আপনি কীভাবে uname -sআলাদা বলতে পারবেন uname?
আলেকজান্ডার মিলস

@ আলেকজান্ডারমিলস-এস,
চেতন কাপুর

6

নীচের এটি ডেবিয়ান এবং RedHat ভিত্তিক সনাক্ত করতে একটি পন্থা হচ্ছে লিনাক্স অপারেটিং সিস্টেম ব্যবহার করে , / etc / lsb-রিলিজ এবং জন্য / etc / অপারেটিং সিস্টেম-রিলিজ (লিনাক্সের গন্ধ আপনি ব্যবহার করছেন উপর নির্ভর করে) এবং এটি উপর ভিত্তি করে একটি সহজ পদক্ষেপ নিন।

#!/bin/bash
set -e

YUM_PACKAGE_NAME="python python-devl python-pip openssl-devel"
DEB_PACKAGE_NAME="python2.7 python-dev python-pip libssl-dev"

 if cat /etc/*release | grep ^NAME | grep CentOS; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on CentOS"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Red; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on RedHat"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Fedora; then
    echo "================================================"
    echo "Installing packages $YUM_PACKAGE_NAME on Fedorea"
    echo "================================================"
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Ubuntu; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Ubuntu"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Debian ; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Debian"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Mint ; then
    echo "============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Mint"
    echo "============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Knoppix ; then
    echo "================================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Kanoppix"
    echo "================================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 else
    echo "OS NOT DETECTED, couldn't install package $PACKAGE"
    exit 1;
 fi

exit 0

উবুন্টু লিনাক্সের জন্য আউটপুট উদাহরণ :

delivery@delivery-E5450$ sudo sh detect_os.sh
[sudo] password for delivery: 
NAME="Ubuntu"
===============================================
Installing packages python2.7 python-dev python-pip libssl-dev on Ubuntu
===============================================
Ign http://dl.google.com stable InRelease
Get:1 http://dl.google.com stable Release.gpg [916 B]                          
Get:2 http://dl.google.com stable Release [1.189 B] 
...            

5

এটি সমস্ত ডিস্ট্রোজে নিরাপদে ব্যবহার করা উচিত।

$ cat /etc/*release

এটি এরকম কিছু তৈরি করে।

     DISTRIB_ID=LinuxMint
     DISTRIB_RELEASE=17
     DISTRIB_CODENAME=qiana
     DISTRIB_DESCRIPTION="Linux Mint 17 Qiana"
     NAME="Ubuntu"
     VERSION="14.04.1 LTS, Trusty Tahr"
     ID=ubuntu
     ID_LIKE=debian
     PRETTY_NAME="Ubuntu 14.04.1 LTS"
     VERSION_ID="14.04"
     HOME_URL="http://www.ubuntu.com/"
     SUPPORT_URL="http://help.ubuntu.com/"
     BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

আপনার ইচ্ছামতো ভেরিয়েবলগুলিতে এক্সট্রাক্ট / এসাইন করুন

দ্রষ্টব্য: কিছু সেটআপে। এটি আপনাকে কিছু ত্রুটিও দিতে পারে যা আপনি উপেক্ষা করতে পারেন।

     cat: /etc/upstream-release: Is a directory

দ্রষ্টব্য: CentOS এ, এটি দেয়[user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)
সিএফস্ট্রাসগুলি

হ্যাঁ, আমি যে আউটপুট পোস্ট করেছি তা হ'ল আমার ল্যাপটপের একটি উদাহরণ, আপনি যে কোনও জায়গায় দেখতে পাচ্ছেন না এমন স্থির সামগ্রী।
আরজে


1
+1 আমি স্ক্রিপ্টের শুরুতে সেট-ই ব্যবহার করছি (সুতরাং এই সমাধানটি doxer.org/linux- Shell-centos-debian-ostype কাজ করছে না )। এবং অন্যান্য সমাধানগুলি বিশেষত সেন্টোস করে না। তবে আমি এই রেফারেন্সটি পেয়েছি যা এই উত্তরটি প্রমাণ করেছে unix.stackexchange.com/a/92212
gihanchanuka

4
ম্যাকের জন্য কাজ করে না:cat: /etc/*release: No such file or directory
ভ্রান্ত

3

এটা চেষ্টা কর:

DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"')
echo "Determined platform: $DISTRO"

cat: /etc/*-release: No such file or directory
ম্যাকোজে

@ সেক্সটন সত্যই, আমিও একই পাচ্ছি: zsh: no matches found: /etc/*release- আমি মনে করি এটি কেবল লিনাক্স সিস্টেমের জন্যই কাজ করবে ...
আলেকজান্ডার নেক্রাসভ

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

3

আপনি যদি ক্লজটি প্রয়োজন হিসাবে এটি ব্যবহার করতে পারেন এবং এটি প্রয়োজন হিসাবে এটি প্রসারিত করুন:

if [ "${OSTYPE//[0-9.]/}" == "darwin" ]
then
    aminute_ago="-v-1M"
elif  [ "${OSTYPE//[0-9.]/}" == "linux-gnu" ]
then
    aminute_ago="-d \"1 minute ago\""
fi

2

আমি কয়েকটি লিনাক্স ডিস্ট্রোজে উপরোক্ত বার্তাগুলি চেষ্টা করেছিলাম এবং নীচেরটি আমার পক্ষে সবচেয়ে ভাল কাজ করার জন্য খুঁজে পেয়েছি। এটি একটি সংক্ষিপ্ত, সংক্ষিপ্ত নির্ভুল শব্দের উত্তর যা উইন্ডোজে বাশের পক্ষেও কাজ করে।

OS=$(cat /etc/*release | grep ^NAME | tr -d 'NAME="') #$ echo $OS # Ubuntu

2
যতক্ষণ এই কোড স্নিপেট স্বাগত, এবং কিছু সাহায্য প্রদান করতে পারে, এটা হবে ব্যাপকভাবে উন্নত যদি এটা একটি ব্যাখ্যা অন্তর্ভুক্ত এর কিভাবে এবং কেন এই সমাধান সমস্যা। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, কেবল এখনই জিজ্ঞাসা করা ব্যক্তি নয়! দয়া করে ব্যাখ্যা যুক্ত করতে আপনার উত্তর সম্পাদনা করুন, এবং কোন সীমাবদ্ধতা এবং অনুমানগুলি প্রযোজ্য তা একটি ইঙ্গিত দিন।
টবি স্পিড

1
বেশিরভাগ লিনাক্স সিস্টেমের জন্য সুন্দর এবং অবিচ্ছিন্ন বলে মনে হচ্ছে, তবে দুর্ভাগ্যক্রমে এটি ম্যাকোজে ত্রুটি ঘটবে। সম্ভবত এটি "বাশের কাছ থেকে লিনাক্স বিতরণের স্বাদ সনাক্ত করতে পারে
সিসেক্সটন

1
@csexton OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )এটি ত্রুটি না ছড়িয়ে কাজ করবে work
কুজেকো

আসলে, এখানে একটি সঠিক উপায়OS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
কুজেকো

@ কুজেকো আমি দুর্ভাগ্যক্রমে এখনও ম্যাকস এ চালানোর ত্রুটি পেয়েছি।
csexton

1

আমার .bashrc এবং .bash_alias কে একটি ফাইল শেয়ারে রাখার প্রবণতা রয়েছে যা সমস্ত প্ল্যাটফর্ম অ্যাক্সেস করতে পারে। এইভাবে আমি আমার .বাশ_লিয়ায় সমস্যাটি জয় করেছি:

if [[ -f (name of share)/.bash_alias_$(uname) ]]; then
    . (name of share)/.bash_alias_$(uname)
fi

এবং আমার কাছে উদাহরণস্বরূপ একটি .বাশ_লিয়াস_লিনাক্স রয়েছে:

alias ls='ls --color=auto'

এইভাবে আমি প্ল্যাটফর্ম নির্দিষ্ট এবং পোর্টেবল কোড পৃথক রাখি, আপনি .bashrc এর জন্যও একই কাজ করতে পারেন


1

এটি knownযদি লিনাক্স ডিস্ট্রো ডেবিয়ান বা উবুনু হয় তা সনাক্ত করার জন্য এটি একগুচ্ছ ফাইলগুলি পরীক্ষা করে , তবে এটি $OSTYPEভেরিয়েবলের ডিফল্ট হয় ।

os='Uknown'
unamestr="${OSTYPE//[0-9.]/}"
os=$( compgen -G "/etc/*release" > /dev/null  && cat /etc/*release | grep ^NAME | tr -d 'NAME="'  ||  echo "$unamestr")

echo "$os"

-1

নিম্নলিখিতটি করা উবুন্টুর জন্য চেকটি সঠিকভাবে সম্পাদন করতে সহায়তা করেছে:

if [[ "$OSTYPE" =~ ^linux ]]; then
    sudo apt-get install <some-package>
fi

4
অন্যান্য লিনাক্স সিস্টেমগুলি কীভাবে অপ্ট-গেট ব্যবহার করে না?
উইলফ

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