У меня есть сценарий оболочки, который используется как на Windows / Cygwin и Mac и Linux. Для каждой версии нужны немного разные переменные.
Как скрипт shell / bash может определить, запущен ли он в Cygwin, на Mac или в Linux?
источник
У меня есть сценарий оболочки, который используется как на Windows / Cygwin и Mac и Linux. Для каждой версии нужны немного разные переменные.
Как скрипт shell / bash может определить, запущен ли он в Cygwin, на Mac или в Linux?
Обычно 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)
чтобы обнаружить Cygwin.Вот скрипт bash, который я использовал для обнаружения трех разных типов ОС (GNU / Linux, Mac OS X, Windows NT)
Обращать внимание
#!/usr/bin/env bash
вместо,#!/bin/sh
чтобы предотвратить проблему, вызванную/bin/sh
связью с другой оболочкой по умолчанию на разных платформах, иначе будет ошибка, подобная неожиданному оператору , это то, что произошло на моем компьютере (Ubuntu 64 бита, 12.04).expr
программы, если вы не установите ее, поэтому я просто используюuname
.дизайн
uname
для получения системной информации (-s
параметр).expr
иsubstr
для работы со строкой.if
elif
fi
чтобы сделать соответствующую работу.uname -s
спецификации.Реализация
тестирование
Что я выучил
Ссылки
источник
[ "$(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
)Ниже
Makefile
вдохновлен Git проекта (config.mak.uname
) .Смотрите также этот полный ответ о
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
OpenBSD
OpenBSD
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
:Это имеет крошечное преимущество по сравнению с
uname
тем, что не требует запуска нового процесса, поэтому будет выполняться быстрее.Однако я не могу найти достоверный список ожидаемых значений. Для меня в Ubuntu 14.04 это «linux-gnu». Я очистил сеть для некоторых других ценностей. Следовательно:
Звездочки важны в некоторых случаях - например, 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 automake для всех доступных типов.Чтобы опираться на ответ Альберта, мне нравится использовать
$COMSPEC
для обнаружения Windows:Это позволяет избежать синтаксического анализа вариантов имен Windows
$OS
и таких вариантов,uname
как MINGW, Cygwin и т. Д.Фон:
%COMSPEC%
переменная среды Windows, задающая полный путь к командному процессору (он же оболочка Windows). Значение этой переменной, как правило%SystemRoot%\system32\cmd.exe
, равноC:\Windows\system32\cmd.exe
.источник
Если в команде 6 первых символов uname -s указано «CYGWIN», предполагается система cygwin.
источник
if [ `uname -s` == CYGWIN* ]; then
выглядит лучше и работает так же.[[ $(uname -s) == CYGWIN* ]]
. Следует также отметить , что расширенные регулярные выражения являются более точными в нашем случае:[[ $(uname -s) =~ ^CYGWIN* ]]
.expr substr $(uname -s) 1 6
выдает ошибку (expr: syntax error
) на MacOS.Хорошо, вот мой путь.
например
Я использую это в моих точечных файлах
источник
http://en.wikipedia.org/wiki/Uname
Вся информация, которая вам когда-либо понадобится. Google твой друг.
Используйте
uname -s
для запроса имени системы.Darwin
CYGWIN_...
LINUX
для большинстваисточник
Подсистема Windows для Linux не существовала, когда задавался этот вопрос. Это дало эти результаты в моем тесте:
Это означает, что вам нужен uname -r, чтобы отличить его от родного Linux.
источник
Я полагаю, что uname ответ непобедим, в основном с точки зрения чистоты.
Хотя выполнение занимает смешное время, я обнаружил, что тестирование на наличие определенных файлов также дает хорошие и более быстрые результаты, поскольку я не вызываю исполняемый файл:
Так,
[ -f /usr/bin/cygwin1.dll ] && echo Yep, Cygwin running
просто использует быструю проверку наличия файла Bash. Поскольку я сейчас нахожусь на Windows, я не могу сказать вам какие-либо конкретные файлы для Linux и Mac OS X, но я почти уверен, что они существуют. :-)
источник
Использование только этого из командной строки работает очень хорошо, благодаря Джастину:
источник
источник