সাইগউইন, ম্যাক বা লিনাক্সে চলছে কিনা তা কীভাবে পরীক্ষা করবেন?


334

আমার কাছে একটি শেল স্ক্রিপ্ট রয়েছে যা উইন্ডোজ / সিগউইন এবং ম্যাক এবং লিনাক্স উভয় ক্ষেত্রেই ব্যবহৃত হয়। প্রতিটি সংস্করণের জন্য এর কিছুটা আলাদা ভেরিয়েবল দরকার।

শেল / ব্যাশ স্ক্রিপ্ট কীভাবে সনাক্ত করতে পারে যে এটি সাইগউইন, ম্যাকে বা লিনাক্সে চলছে কিনা?

উত্তর:


322

সাধারণত, unameএর বিভিন্ন বিকল্পের সাহায্যে আপনাকে বলা হবে আপনি কোন পরিবেশে চলেছেন:

pax> uname -a
CYGWIN_NT-5.1 IBM-L3F3936 1.5.25(0.156/4/2) 2008-06-12 19:34 i686 Cygwin

pax> uname -s
CYGWIN_NT-5.1

এবং, খুব সহায়ক অনুযায়ী schot(মন্তব্য নেই), uname -sদেয় Darwinওএসএক্স এবং Linux, লিনাক্সের জন্য যখন আমার Cygwin দেয় CYGWIN_NT-5.1। তবে আপনাকে বিভিন্ন ধরণের বিভিন্ন সংস্করণ নিয়ে পরীক্ষা করতে হতে পারে।

সুতরাং এই bashজাতীয় একটি চেক করার কোডটি এই লাইনের সাথে থাকবে:

unameOut="$(uname -s)"
case "${unameOut}" in
    Linux*)     machine=Linux;;
    Darwin*)    machine=Mac;;
    CYGWIN*)    machine=Cygwin;;
    MINGW*)     machine=MinGw;;
    *)          machine="UNKNOWN:${unameOut}"
esac
echo ${machine}

মনে রাখবেন যে আমি এখানে ধরে নিচ্ছি যে আপনি প্রকৃতপক্ষে সাইগউইন (এর শেল) এর মধ্যে চলছে bashতাই পাথগুলি ইতিমধ্যে সঠিকভাবে সেট আপ করা উচিত। একজন মন্তব্যকারী নোট হিসাবে, আপনি নিজে bashথেকে প্রোগ্রামটি cmdচালিয়ে স্ক্রিপ্টটি পাস করতে পারেন এবং এর ফলে পাথগুলি প্রয়োজনীয় হিসাবে সেট আপ না করা হতে পারে।

আপনি যদি হয় যে করছেন, তাহলে সম্ভবত এটি পাথ পরিবর্তন পূর্বেই বা সম্পূর্ণভাবে (যেমন, এক্সিকিউটেবল অবস্থানে নির্দিষ্ট করে সঠিক এক্সেকিউটেবল নিশ্চিত করা আপনার দায়িত্ব (অর্থাত, CygWin বেশী), আহবান করা হয় এর /c/cygwin/bin/uname)।


11
কখনও কখনও কম বেশি হয়;) BTW, উইকিপিডিয়া কোনো সময়ে উদাহরণ uname আউটপুট টেবিল রয়েছে en.wikipedia.org/wiki/Uname
schot

উইন্ডোজ on-তে গিট ব্যাশ আনম-আউটপুট MINGW32_NT-6.1। এছাড়াও, কোন হল /cygdriveউপসর্গ শুধু /cজন্য C:
কলিনম

7
গিট বাশ সাইগউইন নয়। এটি এমএস উইন্ডোজের জন্য মিনিজিডাব্লু, ন্যূনতম জিএনইউ, যার কারণে আচরণটি আলাদা।
বয়ড স্টিফেন স্মিথ জুনিয়র

আমি অন্য উত্তরটি প্রচার করেছি কারণ এই উত্তরটি ওপি অংশের সাথে কাজ করে না How can a shell/bash script detect ...এবং অন্যটি করে।
জেসি চিশলম

যদি আমি "\ সাইগউইন 64৪ \ বিন \ বাশ-সি স্ক্রিপ্টনাম" চালিয়ে সাইগউইনের অধীনে কোনও স্ক্রিপ্ট চালনা করি তবে এটি অগত্যা কাজ করে না। এই পরিস্থিতিতে, সাইগউইন পথটি সেট আপ হয় না এবং আপনার বর্তমান পথে প্রথম uname -sযা আছে unameতা কল করতে শেষ হয়, যা আমার সিস্টেমে সংস্করণটি ইনস্টলিত সংস্করণ হিসাবে দেখা যায় gedaযা পাঠ্যটি ফেরত দেয় WindowsNT। যদিও উপরে বর্ণিত হিসাবে এটি সমানভাবে MinGW সংস্করণ হতে পারে। আইএমও, সাইগউইনের জন্য একটি নির্ভরযোগ্য সনাক্তকরণ অবশ্যই সঠিকভাবে নির্ধারিত পথেই নির্ভর করবে না । সুতরাং, সাইগউইন সনাক্তকরণে $(uname -s)পরিবর্তন করা উচিত $(/bin/uname -s)
জুলাই

329

আমি এখানে তিনটি ভিন্ন ওএস প্রকার (জিএনইউ / লিনাক্স, ম্যাক ওএস এক্স, উইন্ডোজ এনটি) সনাক্ত করতে ব্যাশ স্ক্রিপ্টটি ব্যবহার করেছি is

মনোযোগ দিন

  • আপনার বাশ স্ক্রিপ্টে, বিভিন্ন প্ল্যাটফর্মের বিভিন্ন ডিফল্ট শেলের সাথে যুক্ত হয়ে সমস্যা রোধ করার #!/usr/bin/env bashপরিবর্তে ব্যবহার করুন বা অপ্রত্যাশিত অপারেটরের মতো ত্রুটি ঘটবে , যা আমার কম্পিউটারে ঘটেছিল (উবুন্টু 64 বিট 12.04)।#!/bin/sh/bin/sh
  • Mac OS X এর 10.6.8 (স্নো চিতাবাঘ) না থাকে exprপ্রোগ্রাম যদি না আপনি এটা ইনস্টল করুন যাতে আমি শুধু ব্যবহার করেন, uname

নকশা

  1. unameসিস্টেমের তথ্য ( -sপ্যারামিটার) পেতে ব্যবহার করুন ।
  2. স্ট্রিং মোকাবেলা exprএবং ব্যবহার substrকরতে।
  3. if elif fiম্যাচিং কাজটি করতে ব্যবহার করুন ।
  4. আপনি চাইলে আরও সিস্টেম সমর্থন যুক্ত করতে পারেন, কেবলমাত্র বিবরণটি অনুসরণ করুন uname -s

বাস্তবায়ন

#!/usr/bin/env bash

if [ "$(uname)" == "Darwin" ]; then
    # Do something under Mac OS X platform        
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
    # Do something under GNU/Linux platform
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]; then
    # Do something under 32 bits Windows NT platform
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
    # Do something under 64 bits Windows NT platform
fi

পরীক্ষামূলক

  • লিনাক্স (উবুন্টু 12.04 এলটিএস, কার্নেল 3.2.0) ঠিক আছে পরীক্ষিত।
  • ওএস এক্স (10.6.8 স্নো চিতা) ঠিক আছে পরীক্ষা করেছে।
  • উইন্ডোজ (উইন্ডোজ 7 64 বিট) ঠিক আছে পরীক্ষা করা হয়েছে।

আমি যা শিখেছি

  1. উভয় প্রারম্ভিক এবং সমাপ্ত উদ্ধৃতি পরীক্ষা করুন।
  2. অনুপস্থিত বন্ধনী এবং ধনুর্বন্ধনী জন্য পরীক্ষা করুন {}

তথ্যসূত্র


MinGW জন্য, এটি চেক করতে আরো জানার জন্য করতে পারেন: [ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]
আচল দাভে

2
@ অ্যালবার্ট: এক্সপ্রেশনটি "$(expr substr $(uname -s) 1 5)"কিছুটা অদ্ভুত। সেখানে যে কাজ করতে, উদাহরণস্বরূপ আরো চমত্কার উপায় রয়েছে: if [ `uname -s` == CYGWIN* ]; then। যদি: এটি পড়ুন uname -sদিয়ে শুরু হয় CYGWIN তারপর ...
ডেভিড Ferenczy Rogožan

10
@ ডেভিডফেরেঞ্জি আমি বিশ্বাস করি এর জন্য ডাবল বন্ধনী প্রয়োজন হবেif [[ $(uname -s) == CYGWIN* ]]; then
রোজারডপ্যাক

1
এটি সাইগউইনকে সনাক্ত করে না, যেমন প্রশ্নে জিজ্ঞাসা করা হয়েছিল।
rmcclellan

2
কেন এটি লিনাক্সের জন্য প্রথম 5 টি অক্ষর পরীক্ষা করে? আধুনিক লিনাক্সের ডিস্ট্রোজের উদাহরণ রয়েছে যেখানে uname -s"লিনাক্স" বাদে অন্য কিছু পাওয়া যাবে?
কেটিবিজ

127

uname -s( --kernel-name) ব্যবহার করুন কারণ uname -o( --operating-system) ম্যাক ওএস এবং সোলারিসের মতো কয়েকটি অপারেটিং সিস্টেমগুলিতে সমর্থিত নয় । আপনি unameকোনও যুক্তি ছাড়াই কেবল ব্যবহার করতে পারেন যেহেতু ডিফল্ট আর্গুমেন্ট -s( --kernel-name)।

নীচে স্নিপেট প্রয়োজন হয় না (যেমন প্রয়োজন হয় না #!/bin/bash)

#!/bin/sh

case "$(uname -s)" in

   Darwin)
     echo 'Mac OS X'
     ;;

   Linux)
     echo 'Linux'
     ;;

   CYGWIN*|MINGW32*|MSYS*|MINGW*)
     echo 'MS Windows'
     ;;

   # Add here more strings to compare
   # See correspondence table at the bottom of this answer

   *)
     echo 'Other OS' 
     ;;
esac

নীচে গিট প্রকল্প ( )Makefile থেকে অনুপ্রাণিত হয়েছে ।config.mak.uname

ifdef MSVC     # Avoid the MingW/Cygwin sections
    uname_S := Windows
else                          # If uname not available => 'not' 
    uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
endif

# Avoid nesting "if .. else if .. else .. endif endif"
# because maintenance of matching if/else/endif is a pain

ifeq ($(uname_S),Windows)
    CC := cl 
endif
ifeq ($(uname_S),OSF1)
    CFLAGS += -D_OSF_SOURCE
endif
ifeq ($(uname_S),Linux)
    CFLAGS += -DNDEBUG
endif
ifeq ($(uname_S),GNU/kFreeBSD)
    CFLAGS += -D_BSD_ALLOC
endif
ifeq ($(uname_S),UnixWare)
    CFLAGS += -Wextra
endif
...

সম্পর্কে uname -sএবং এই সম্পূর্ণ উত্তরMakefile দেখুন ।

এই উত্তরের নীচে চিঠিপত্রের টেবিলটি উইকিপিডিয়া নিবন্ধuname থেকে । এটি আপ টু ডেট রাখতে অবদান রাখুন (উত্তরটি সম্পাদনা করুন বা একটি মন্তব্য পোস্ট করুন)। আপনি উইকিপিডিয়া নিবন্ধ আপডেট করতে পারেন এবং আপনার অবদান সম্পর্কে আমাকে অবহিত করতে একটি মন্তব্য পোস্ট করতে পারেন ;-)

Operating System uname -s
Mac OS X Darwin
Cygwin 32-bit (Win-XP) CYGWIN_NT-5.1
Cygwin 32-bit (Win-7 32-bit)CYGWIN_NT-6.1
Cygwin 32-bit (Win-7 64-bit)CYGWIN_NT-6.1-WOW64
Cygwin 64-bit (Win-7 64-bit)CYGWIN_NT-6.1
MinGW (Windows 7 32-bit) MINGW32_NT-6.1
MinGW (Windows 10 64-bit) MINGW64_NT-10.0
Interix (Services for UNIX) Interix
MSYS MSYS_NT-6.1
MSYS2 MSYS_NT-10.0-17763
Windows Subsystem for Linux Linux
Android Linux
coreutils Linux
CentOS Linux
Fedora Linux
Gentoo Linux
Red Hat Linux Linux
Linux Mint Linux
openSUSE Linux
Ubuntu Linux
Unity Linux Linux
Manjaro Linux Linux
OpenWRT r40420 Linux
Debian (Linux) Linux
Debian (GNU Hurd) GNU
Debian (kFreeBSD) GNU/kFreeBSD
FreeBSD FreeBSD
NetBSD NetBSD
DragonFlyBSD DragonFly
Haiku Haiku
NonStop NONSTOP_KERNEL
QNX QNX
ReliantUNIX ReliantUNIX-Y
SINIX SINIX-Y
Tru64 OSF1
Ultrix ULTRIX
IRIX 32 bits IRIX
IRIX 64 bits IRIX64
MINIX Minix
Solaris SunOS
UWIN (64-bit Windows 7) UWIN-W7
SYS$UNIX:SH on OpenVMS IS/WB
z/OS USS OS/390
Cray sn5176
(SCO) OpenServer SCO_SV
(SCO) System V SCO_SV
(SCO) UnixWare UnixWare
IBM AIX AIX
IBM i with QSH OS400
HP-UX HP-UX


3
উপরে সোলারিস এবং গবেষণার জন্য থাম্বস আপ।
Okutane

হাই @okutane। আমি বুঝছি না তুমি কি বলতে চাচ্ছ. আরও বিশদ সরবরাহ করুন। আপনি কি কিছু পরামর্শ দেন? চিয়ার্স
ওলিব্রে

3
আমি ভোট দিচ্ছি, এটাই।
Okutane

1
পোর্টেবল / ক্রস-প্ল্যাটফর্ম ~/.profile(পরিবেশের পরিবর্তনশীলগুলি সেট করার জন্য $PATH- উত্তরোত্তর অনুসন্ধানের কীওয়ার্ড সরবরাহ করার জন্য মন্তব্য করা) লিখতে আমি এটি ঠিক যা খুঁজছিলাম ।
ব্রাহাম স্নাইডার

1
আমি এখানে এসেছি কারণ আমি বিশেষত ডাব্লুএসএল সনাক্ত করতে এবং অন্য লিনাক্স থেকে আলাদা করতে চেয়েছিলাম। আমার পক্ষে তখন যা কাজ করছে তা হ'ল আগের uname -srতুলনায় পরীক্ষা করা এবং তুলনা করা । Linux*Microsoft)Linux*)
einarmagnus

65

বাশ শেল ভেরিয়েবল OSTYPE সেট করে। থেকে man bash:

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

এটির একটি ছোট সুবিধা রয়েছে unameযে এটির জন্য একটি নতুন প্রক্রিয়া আরম্ভ করার দরকার নেই, তাই এটি কার্যকর করা দ্রুত হবে।

তবে, আমি প্রত্যাশিত মানগুলির একটি অনুমোদনযোগ্য তালিকা খুঁজে পেতে অক্ষম। আমার জন্য উবুন্টু 14.04 এ এটি 'লিনাক্স-গনু' তে সেট করা আছে। আমি অন্যান্য কিছু মানের জন্য ওয়েবকে স্ক্র্যাপ করেছি। অত: পর:

case "$OSTYPE" in
  linux*)   echo "Linux / WSL" ;;
  darwin*)  echo "Mac OS" ;; 
  win*)     echo "Windows" ;;
  msys*)    echo "MSYS / MinGW / Git Bash" ;;
  cygwin*)  echo "Cygwin" ;;
  bsd*)     echo "BSD" ;;
  solaris*) echo "Solaris" ;;
  *)        echo "unknown: $OSTYPE" ;;
esac

তারকাচিহ্নগুলি কয়েকটি ক্ষেত্রে গুরুত্বপূর্ণ - উদাহরণস্বরূপ ওএসএক্স 'ডারউইন' এর পরে একটি ওএস সংস্করণ নম্বর সংযোজন করে। 'উইন' মানটি আসলে 'win32', আমাকে বলা হয় - সম্ভবত কোনও 'win64' আছে?

সম্ভবত আমরা এখানে যাচাই করা মানগুলির একটি সারণী তৈরি করতে একসাথে কাজ করতে পারি:

  • লিনাক্স উবুন্টু ( ডাব্লুএসএল সহ ):linux-gnu
  • সাইগউইন 64৪-বিট: cygwin
  • Msys / MINGW (উইন্ডোজের জন্য গিট ব্যাশ): msys

(দয়া করে আপনার মানটি বিদ্যমান এন্ট্রিগুলির থেকে পৃথক হলে সংযোজন করুন)


1
আমি আপনার উত্তরটি আমার চেয়ে ইতিমধ্যে পছন্দ করি, আমার
এটির

6
প্রযুক্তিগতভাবে, এটি পরিবেশের পরিবর্তনশীল নয়, এটি শেল ভেরিয়েবল। এজন্য আপনি এটিকে নীচে দেখতে পাবেন না env | grep OSTYPE, তবে আপনি এটি নীচে দেখতে পাবেনset | grep OSTYPE
উইসবাকী

4
যারা আগ্রহী জন্য, ব্যাশ এর OSTYPEপরিবর্তনশীল (conftypes.h) automake এর সঠিক কপি ব্যবহার বিল্ড সময়ে কনফিগার করা OSপরিবর্তনশীল (Makefile.in) । উপলভ্য সমস্ত ধরণের জন্য অটোমেকের lib / config.sub ফাইলের জন্য পরামর্শ নেওয়া যেতে পারে ।
জেডকিটনাট

9

অ্যালবার্টের উত্তরের জন্য, আমি $COMSPECউইন্ডোজ সনাক্ত করার জন্য ব্যবহার করতে চাই :

#!/bin/bash

if [ "$(uname)" == "Darwin" ]
then
 echo Do something under Mac OS X platform
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]
then
  echo Do something under Linux platform
elif [ -n "$COMSPEC" -a -x "$COMSPEC" ]
then 
  echo $0: this script does not support Windows \:\(
fi

এটি উইন্ডোজ নামের $OSবৈচিত্রগুলি পার্সিং এবং unameএমিংডাব্লু, সাইগউইন ইত্যাদির বৈকল্পিকগুলি পার্সিং এড়িয়ে চলে

পটভূমি: %COMSPEC%একটি উইন্ডোজ পরিবেশগত পরিবর্তনশীল যা কমান্ড প্রসেসরের পুরো পথ নির্দিষ্ট করে (উইন্ডোজ শেল ওরফে)। এই ভেরিয়েবলের মানটি সাধারণত হয় %SystemRoot%\system32\cmd.exeযা সাধারণত মূল্যায়ন করে C:\Windows\system32\cmd.exe


আর কোনও সংশোধন করবেন না কারণ উইন্ডোজ ইউডাব্লুএস বাশ পরিবেশের অধীনে চলার সময় COMSPEC সেট করা থাকে না।
জুলিয়ান নাইট

9
# This script fragment emits Cygwin rulez under bash/cygwin
if [[ $(uname -s) == CYGWIN* ]];then
    echo Cygwin rulez
else 
    echo Unix is king
fi

Uname -s কমান্ডের 6 টি প্রথম অক্ষর যদি "CYGWIN" হয় তবে একটি সাইগউইন সিস্টেম ধরে নেওয়া হয়


if [ `uname -s` == CYGWIN* ]; thenআরও ভাল দেখাচ্ছে এবং একই কাজ করে।
ডেভিড ফেরেনসি রোগোয়ান

6
হ্যাঁ, কিন্তু ডবল বন্ধনী ব্যবহার করুন: [[ $(uname -s) == CYGWIN* ]]। উল্লেখ্য যে বর্ধিত রেগুলার এক্সপ্রেশনের আমাদের ক্ষেত্রে আরও ভালো আছেন: [[ $(uname -s) =~ ^CYGWIN* ]]
Andreas Spindler

উপরেরটি আরও ভাল কাজ করে, কারণ expr substr $(uname -s) 1 6ম্যাকোজে একটি ত্রুটি দেয় ( expr: syntax error)।
ডকম্যান

2

ঠিক আছে, এখানে আমার উপায়।

osis()
{
    local n=0
    if [[ "$1" = "-n" ]]; then n=1;shift; fi

    # echo $OS|grep $1 -i >/dev/null
    uname -s |grep -i "$1" >/dev/null

    return $(( $n ^ $? ))
}

যেমন

osis Darwin &&
{
    log_debug Detect mac osx
}
osis Linux &&
{
    log_debug Detect linux
}
osis -n Cygwin &&
{
    log_debug Not Cygwin
}

আমি আমার ডটফাইলে এটি ব্যবহার করি


2

http://en.wikipedia.org/wiki/Uname

আপনার প্রয়োজন সব তথ্য। গুগল আপনার বন্ধু।

uname -sসিস্টেমের নামটি জিজ্ঞাসা করতে ব্যবহার করুন ।

  • ম্যাক: Darwin
  • Cygwin: CYGWIN_...
  • লিনাক্স: বিভিন্ন, LINUXবেশিরভাগ ক্ষেত্রে

2

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

uname -s -> Linux
uname -o -> GNU/Linux
uname -r -> 4.4.0-17763-Microsoft

এর অর্থ এটি আপনার দেশীয় লিনাক্স থেকে আলাদা করার জন্য অ্যামে -আর দরকার।


1
দুর্ভাগ্যক্রমে, Mingw-w64 ঠিক একই দেয়।
একটি কুয়াশা

1

আমি অনুমান করি যে অমূল্য উত্তরটি অপরাজেয়, মূলত পরিষ্কার পরিচ্ছন্নতার ক্ষেত্রে।

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

সুতরাং,

[ -f /usr/bin/cygwin1.dll ] && echo Yep, Cygwin running

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


-3

কমান্ড লাইন থেকে এটি কেবলমাত্র ব্যবহার করুন জাস্টিনকে ধন্যবাদ:

#!/bin/bash

################################################## #########
# Bash script to find which OS
################################################## #########

OS=`uname`
echo "$OS"

সূত্র


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