Відповіді:
Зазвичай, за 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
для OSX та Linux
для 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}
Зауважте, що я припускаю, що ви насправді працюєте в CygWin ( 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, як описано вище. Надійне виявлення cygwin не повинно покладатися на відповідний шлях, IMO. Тому $(uname -s)
слід змінити, $(/bin/uname -s)
щоб виявити цигвін.
#!/usr/bin/env bash
замість того, #!/bin/sh
щоб запобігти проблемі, викликаній /bin/sh
зв’язком з різними оболонками за замовчуванням на різних платформах, інакше буде помилка, як несподіваний оператор , ось що трапилося на моєму комп’ютері (Ubuntu 64 біт 12.04).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
вийде щось інше, ніж "Linux"?
Використовуйте uname -s
( --kernel-name
), оскільки uname -o
( --operating-system
) не підтримується в деяких операційних системах, таких як Mac OS і Solaris . Ви також можете використовувати просто 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
надихається проект Git ( 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*)
.
Bash встановлює змінну оболонки OSTYPE. Від man bash
:
Автоматично встановлюється рядок, що описує операційну систему, на якій виконується bash.
Це має невелику перевагу перед uname
тим, що він не потребує запуску нового процесу, тому його швидше виконати.
Однак мені не вдається знайти авторитетний перелік очікуваних значень. Для мене на Ubuntu 14.04 встановлено значення "linux-gnu". Я викреслив Інтернет для деяких інших значень. Звідси:
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
Зірочки важливі в деяких випадках - наприклад, OSX додає номер версії ОС після 'darwin'. Значення "win" насправді "win32", мені кажуть - можливо, є "win64"?
Можливо, ми могли б працювати разом, щоб заповнити таблицю перевірених значень тут:
linux-gnu
cygwin
msys
(Будь ласка, додайте свою вартість, якщо вона відрізняється від існуючих записів)
env | grep OSTYPE
, але ви побачите його підset | grep OSTYPE
OSTYPE
змінна Bash (conftypes.h) налаштовується під час збирання за допомогою точної копії OS
змінної automake (Makefile.in) . Можна звернутися до файлу lib / config.sub автоматики для всіх доступних типів.
На основі відповіді Альберта я люблю використовувати $COMSPEC
для виявлення Windows:
#!/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 для $OS
та розбору варіантів на uname
зразок MINGW, Cygwin тощо.
Передумови: %COMSPEC%
це змінна середовище Windows із зазначенням повного шляху до командного процесора (він же оболонки Windows). Значення цієї змінної, як %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
Якщо 6 перших символів команди unme -s - "CYGWIN", передбачається система cygwin
if [ `uname -s` == CYGWIN* ]; then
виглядає краще і працює так само.
[[ $(uname -s) == CYGWIN* ]]
. Слід також зазначити , що розширені регулярні вирази є більш точними в нашому випадку: [[ $(uname -s) =~ ^CYGWIN* ]]
.
expr substr $(uname -s) 1 6
дає помилку ( expr: syntax error
) на macOS.
Гаразд, ось мій шлях.
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
Вся інформація, яка вам коли-небудь знадобиться. Google - ваш друг.
Використовуйте uname -s
для запиту назви системи.
Darwin
CYGWIN_...
LINUX
для більшостіПідсистема Windows для Linux не існувала, коли було задано це питання. Це дало такі результати в моєму тесті:
uname -s -> Linux
uname -o -> GNU/Linux
uname -r -> 4.4.0-17763-Microsoft
Це означає, що вам потрібно uname -r, щоб відрізнити його від рідного Linux.
Я думаю, що невірна відповідь є неперевершеною, головним чином з точки зору чистоти.
Хоча для виконання потрібен смішний час, я виявив, що тестування на наявність конкретних файлів також дає хороші та швидші результати, оскільки я не посилаюсь на виконуваний файл:
Тому,
[ -f /usr/bin/cygwin1.dll ] && echo Yep, Cygwin running
просто використовує швидку перевірку наявності файлу Bash. Оскільки я зараз в Windows, я не можу сказати вам про конкретні файли для Linuxes та Mac OS X з моєї голови, але я впевнений, що вони існують. :-)
Використовувати лише це з командного рядка дуже добре, завдяки Джастіну:
#!/bin/bash
################################################## #########
# Bash script to find which OS
################################################## #########
OS=`uname`
echo "$OS"