উত্তর:
সাধারণত, 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
)।
MINGW32_NT-6.1
। এছাড়াও, কোন হল /cygdrive
উপসর্গ শুধু /c
জন্য C:
।
How can a shell/bash script detect ...
এবং অন্যটি করে।
uname -s
যা আছে uname
তা কল করতে শেষ হয়, যা আমার সিস্টেমে সংস্করণটি ইনস্টলিত সংস্করণ হিসাবে দেখা যায় geda
যা পাঠ্যটি ফেরত দেয় WindowsNT
। যদিও উপরে বর্ণিত হিসাবে এটি সমানভাবে MinGW সংস্করণ হতে পারে। আইএমও, সাইগউইনের জন্য একটি নির্ভরযোগ্য সনাক্তকরণ অবশ্যই সঠিকভাবে নির্ধারিত পথেই নির্ভর করবে না । সুতরাং, সাইগউইন সনাক্তকরণে $(uname -s)
পরিবর্তন করা উচিত $(/bin/uname -s)
।
#!/usr/bin/env bash
পরিবর্তে ব্যবহার করুন বা অপ্রত্যাশিত অপারেটরের মতো ত্রুটি ঘটবে , যা আমার কম্পিউটারে ঘটেছিল (উবুন্টু 64 বিট 12.04)।#!/bin/sh
/bin/sh
expr
প্রোগ্রাম যদি না আপনি এটা ইনস্টল করুন যাতে আমি শুধু ব্যবহার করেন, uname
।uname
সিস্টেমের তথ্য ( -s
প্যারামিটার) পেতে ব্যবহার করুন ।expr
এবং ব্যবহার substr
করতে।if
elif
fi
ম্যাচিং কাজটি করতে ব্যবহার করুন ।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
[ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]
।
"$(expr substr $(uname -s) 1 5)"
কিছুটা অদ্ভুত। সেখানে যে কাজ করতে, উদাহরণস্বরূপ আরো চমত্কার উপায় রয়েছে: if [ `uname -s` == CYGWIN* ]; then
। যদি: এটি পড়ুন uname -s
দিয়ে শুরু হয় CYGWIN তারপর ...
if [[ $(uname -s) == CYGWIN* ]]; then
uname -s
"লিনাক্স" বাদে অন্য কিছু পাওয়া যাবে?
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
~/.profile
(পরিবেশের পরিবর্তনশীলগুলি সেট করার জন্য $PATH
- উত্তরোত্তর অনুসন্ধানের কীওয়ার্ড সরবরাহ করার জন্য মন্তব্য করা) লিখতে আমি এটি ঠিক যা খুঁজছিলাম ।
uname -sr
তুলনায় পরীক্ষা করা এবং তুলনা করা । Linux*Microsoft)
Linux*)
বাশ শেল ভেরিয়েবল 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
cygwin
msys
(দয়া করে আপনার মানটি বিদ্যমান এন্ট্রিগুলির থেকে পৃথক হলে সংযোজন করুন)
env | grep OSTYPE
, তবে আপনি এটি নীচে দেখতে পাবেনset | grep OSTYPE
OSTYPE
পরিবর্তনশীল (conftypes.h) automake এর সঠিক কপি ব্যবহার বিল্ড সময়ে কনফিগার করা OS
পরিবর্তনশীল (Makefile.in) । উপলভ্য সমস্ত ধরণের জন্য অটোমেকের lib / config.sub ফাইলের জন্য পরামর্শ নেওয়া যেতে পারে ।
অ্যালবার্টের উত্তরের জন্য, আমি $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
।
# 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
আরও ভাল দেখাচ্ছে এবং একই কাজ করে।
[[ $(uname -s) == CYGWIN* ]]
। উল্লেখ্য যে বর্ধিত রেগুলার এক্সপ্রেশনের আমাদের ক্ষেত্রে আরও ভালো আছেন: [[ $(uname -s) =~ ^CYGWIN* ]]
।
expr substr $(uname -s) 1 6
ম্যাকোজে একটি ত্রুটি দেয় ( expr: syntax error
)।
ঠিক আছে, এখানে আমার উপায়।
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
}
আমি আমার ডটফাইলে এটি ব্যবহার করি
http://en.wikipedia.org/wiki/Uname
আপনার প্রয়োজন সব তথ্য। গুগল আপনার বন্ধু।
uname -s
সিস্টেমের নামটি জিজ্ঞাসা করতে ব্যবহার করুন ।
Darwin
CYGWIN_...
LINUX
বেশিরভাগ ক্ষেত্রেএই প্রশ্নটি জিজ্ঞাসা করার সময় লিনাক্সের জন্য উইন্ডোজ সাবসিস্টেম উপস্থিত ছিল না। এটি আমার পরীক্ষায় এই ফলাফল দিয়েছে:
uname -s -> Linux
uname -o -> GNU/Linux
uname -r -> 4.4.0-17763-Microsoft
এর অর্থ এটি আপনার দেশীয় লিনাক্স থেকে আলাদা করার জন্য অ্যামে -আর দরকার।
আমি অনুমান করি যে অমূল্য উত্তরটি অপরাজেয়, মূলত পরিষ্কার পরিচ্ছন্নতার ক্ষেত্রে।
যদিও এটি কার্যকর করার জন্য একটি হাস্যকর সময় নেয়, তবে আমি দেখতে পেয়েছি যে নির্দিষ্ট ফাইল উপস্থিতির জন্য পরীক্ষা করা আমাকে ভাল এবং দ্রুত ফলাফলও দেয়, যেহেতু আমি একটি কার্যকর করার যোগ্যকে ডাকছি না:
সুতরাং,
[ -f /usr/bin/cygwin1.dll ] && echo Yep, Cygwin running
কেবলমাত্র একটি দ্রুত বাশ ফাইল উপস্থিতি পরীক্ষা ব্যবহার করে। আমি এখনই উইন্ডোজে থাকাকালীন, আমি আপনাকে আমার মাথা থেকে লিনাক্স এবং ম্যাক ওএস এক্স এর জন্য কোনও নির্দিষ্ট ফাইল বলতে পারি না, তবে আমি নিশ্চিত যে সেগুলির উপস্থিতি রয়েছে। :-)
কমান্ড লাইন থেকে এটি কেবলমাত্র ব্যবহার করুন জাস্টিনকে ধন্যবাদ:
#!/bin/bash
################################################## #########
# Bash script to find which OS
################################################## #########
OS=`uname`
echo "$OS"