Yanıtlar:
Genellikle, unameçeşitli seçenekleriyle hangi ortamda çalıştığınızı söyler:
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
Ve, çok yararlı göre schot(yorumlarda), uname -sverir DarwinOSX için ve Linuxbenim Cygwin verir iken, Linux için CYGWIN_NT-5.1. Ancak her türlü farklı sürümü denemeniz gerekebilir.
Yani bashböyle bir kontrol yapmak için kod aşağıdaki satırlarda olacaktır:
unameOut="$(uname -s)"
case "${unameOut}" in
Linux*) machine=Linux;;
Darwin*) machine=Mac;;
CYGWIN*) machine=Cygwin;;
MINGW*) machine=MinGw;;
*) machine="UNKNOWN:${unameOut}"
esac
echo ${machine}
Burada CygWin ( kabuğunun) içinde çalıştığınızı varsayıyorum bash, bu yüzden yollar zaten doğru şekilde ayarlanmalıdır. Bir yorumcunun belirttiği gibi, bashprogramı komut dosyasını geçirerek çalıştırabilirsiniz cmdve bu, yolların gerektiği gibi ayarlanmamasına neden olabilir.
Eğer varsa vardır yapıyor, bu (yani cygwin olanlar) olarak adlandırılan ediliyor doğru yürütülebilir sağlamak sizin sorumluluğunuzdur muhtemelen yolunu değiştirerek önceden veya tamamen (örneğin çalıştırılabilir yerleri belirtilerek var /c/cygwin/bin/uname).
MINGW32_NT-6.1. Ayrıca, hiçbir orada /cygdrivesadece, önek /ciçin C:.
How can a shell/bash script detect ..., diğeri ise öyle.
uname -sçağırır ve unamesistemimde gedametni döndüren sürüm olduğu ortaya çıkar WindowsNT. Yine de yukarıda tarif edildiği gibi MinGW versiyonu olabilir. Cygwin için güvenilir bir tespiti gerekir yol kullanan, IMO uygun ayarlanmıştır. Bu nedenle, cygwin tespit etmek $(uname -s)için değiştirilmelidir $(/bin/uname -s).
#!/usr/bin/env bashyerine #!/bin/shneden olduğu sorunu önlemek için /bin/shfarklı platformlarda farklı varsayılan kabuk bağlı ya da benzeri bir hata olacaktır beklenmedik operatör bilgisayarımda ne en (Ubuntu 64 bit 12.04) olduğu,.expryüklemediğiniz sürece programınız yok , bu yüzden sadece kullanıyorum uname.unameSistem bilgilerini ( -sparametre) almak için kullanın .exprve tuşlarını kullanın substr.if elif fiEşleşen işi yapmak için kullanın .uname -steknik özellikleri izleyin .#!/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)"biraz garip. Örneğin, bunu yapmak için daha güzel yolu vardır: if [ `uname -s` == CYGWIN* ]; then. Okuyun: CYGWINuname -s ile başlıyorsa ...
if [[ $(uname -s) == CYGWIN* ]]; then
uname -s"Linux" dan başka bir şey getirecek modern Linux dağıtım örnekleri var mı?
Kullanım uname -s( --kernel-name) çünkü uname -o( --operating-system) gibi bazı işletim sistemleri üzerinde desteklenmez Mac OS ve Solaris . Varsayılan bağımsız değişken ( ) olduğu için unameherhangi bir bağımsız değişken olmadan da kullanabilirsiniz .-s--kernel-name
Aşağıdaki pasaj gerektirmez darbe(yani gerektirmez #!/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
Aşağıdakiler Git projesinden ( )Makefile esinlenmiştir .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
...
Ayrıca bkz hakkındaki bu tam bir cevap uname -sveMakefile .
Bu cevabın altındaki yazışma tablosu hakkındaki Wikipedia makalesinden alınmıştıruname . Lütfen güncel tutmaya katkıda bulunun (cevabı düzenleyin veya yorum gönderin). Ayrıca Wikipedia makalesini güncelleyebilir ve katkınız hakkında beni bilgilendirmek için bir yorum gönderebilirsiniz ;-)
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(çevre değişkenlerini ayarlamak $PATHiçin - posterity için arama anahtar kelimeleri sağlamak için yorum yapmak).
uname -sredip karşılaştırmaktır . Linux*Microsoft)Linux*)
Bash kabuk değişkenini OSTYPE olarak ayarlar. Gönderen man bash:
Otomatik olarak bash'ın yürütüldüğü işletim sistemini tanımlayan bir dizeye ayarlanır.
Bunun, unameyeni bir işlem başlatmayı gerektirmediği için küçük bir avantajı vardır , bu nedenle yürütülmesi daha hızlı olacaktır.
Ancak, beklenen değerlerin yetkili bir listesini bulamıyorum. Benim için Ubuntu 14.04'te 'linux-gnu' olarak ayarlandı. Web'i başka değerler için kazıyordum. Dolayısıyla:
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
Yıldız işaretleri bazı durumlarda önemlidir - örneğin OSX, 'darwin' den sonra bir OS sürüm numarası ekler. 'Kazanma' değeri aslında 'win32', bana söylendi - belki bir 'win64' var mı?
Belki de burada doğrulanmış değerler tablosunu doldurmak için birlikte çalışabiliriz:
linux-gnucygwinmsys(Lütfen mevcut girişlerden farklıysa değerinizi ekleyin)
env | grep OSTYPE, ama altında göreceksinset | grep OSTYPE
OSTYPEdeğişkeni (conftypes.h) derleme zamanında automake OSdeğişkeninin (Makefile.in) tam kopyası kullanılarak yapılandırılır . Mevcut tüm tipler için automake 'nin lib / config.sub dosyasına bakılabilir .
Albert'in cevabına dayanarak, $COMSPECWindows'u tespit etmek için kullanmayı seviyorum :
#!/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
Windows isimlerin varyantlarını ayrıştırma Bu engeller $OSvaryantları ve ayrıştırma unamevb MinGW Cygwin, gibi
Arka plan: %COMSPEC%komut işlemcisinin (Windows kabuğu olarak da bilinir) tam yolunu belirten bir Windows ortam değişkenidir. Bu değişkenin değeri, tipik %SystemRoot%\system32\cmd.exeolarak değerlendirilen değerdir 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 komutunun ilk 6 grafiği "CYGWIN" ise, bir cygwin sistemi olduğu varsayılır.
if [ `uname -s` == CYGWIN* ]; thendaha iyi görünüyor ve aynı şekilde çalışıyor.
[[ $(uname -s) == CYGWIN* ]]. Genişletilmiş düzenli ifadeler bizim durumumuzda daha hassas olduklarını da unutmayın: [[ $(uname -s) =~ ^CYGWIN* ]].
expr substr $(uname -s) 1 6macOS'ta bir hata ( expr: syntax error) verir .
Tamam, işte benim yolum.
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 ^ $? ))
}
Örneğin
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
İhtiyacınız olan tüm bilgiler. Google Senin Arkadaşın.
uname -sSistem adını sorgulamak için kullanın .
DarwinCYGWIN_...LINUXçoğu içinBu soru sorulduğunda Linux için Windows Alt Sistemi yoktu. Testimde şu sonuçları verdi:
uname -s -> Linux
uname -o -> GNU/Linux
uname -r -> 4.4.0-17763-Microsoft
Bu, yerel Linux'tan ayırt etmek için uname -r'ye ihtiyacınız olduğu anlamına gelir.
Sanırım uname cevap, özellikle temizlik açısından, rakipsiz.
Yürütmek gülünç bir zaman alsa da, belirli dosyaların varlığını test etmenin bana iyi ve daha hızlı sonuçlar verdiğini buldum, çünkü çalıştırılabilir bir dosyayı çağırmıyorum:
Yani,
[ -f /usr/bin/cygwin1.dll ] && echo Yep, Cygwin running
sadece hızlı bir Bash dosya varlığı kontrolü kullanır. Şu anda Windows'ta olduğum için, Linuxes ve Mac OS X için kafamdan belirli bir dosya söyleyemem, ancak var olduklarından eminim. :-)
Komut satırından sadece bunu kullan, Justin sayesinde çok iyi çalışıyor:
#!/bin/bash
################################################## #########
# Bash script to find which OS
################################################## #########
OS=`uname`
echo "$OS"