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 -s
verir Darwin
OSX için ve Linux
benim Cygwin verir iken, Linux için CYGWIN_NT-5.1
. Ancak her türlü farklı sürümü denemeniz gerekebilir.
Yani bash
bö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, bash
programı komut dosyasını geçirerek çalıştırabilirsiniz cmd
ve 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 /cygdrive
sadece, önek /c
için C:
.
How can a shell/bash script detect ...
, diğeri ise öyle.
uname -s
çağırır ve uname
sistemimde geda
metni 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 bash
yerine #!/bin/sh
neden olduğu sorunu önlemek için /bin/sh
farklı 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,.expr
yüklemediğiniz sürece programınız yok , bu yüzden sadece kullanıyorum uname
.uname
Sistem bilgilerini ( -s
parametre) almak için kullanın .expr
ve tuşlarını kullanın substr
.if
elif
fi
Eşleşen işi yapmak için kullanın .uname -s
teknik ö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 uname
herhangi 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 -s
veMakefile
.
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 $PATH
için - posterity için arama anahtar kelimeleri sağlamak için yorum yapmak).
uname -sr
edip 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, uname
yeni 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-gnu
cygwin
msys
(Lütfen mevcut girişlerden farklıysa değerinizi ekleyin)
env | grep OSTYPE
, ama altında göreceksinset | grep OSTYPE
OSTYPE
değişkeni (conftypes.h) derleme zamanında automake OS
değ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, $COMSPEC
Windows'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 $OS
varyantları ve ayrıştırma uname
vb 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.exe
olarak 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* ]; then
daha 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 6
macOS'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 -s
Sistem adını sorgulamak için kullanın .
Darwin
CYGWIN_...
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"