Я хотел бы сохранить свои .bashrc
и .bash_login
файлы под контролем версий, чтобы я мог использовать их между всеми компьютерами, которые я использую. Проблема в том, что у меня есть некоторые псевдонимы для конкретных ОС, поэтому я искал способ определить, работает ли скрипт в Mac OS X, Linux или Cygwin .
Как правильно определить операционную систему в скрипте Bash ?
bash
os-detection
csexton
источник
источник
Ответы:
Я думаю, что следующее должно работать. Я не уверен,
win32
хотя.источник
msys
для Git Bash / msysGit, аcygwin
для Cygwinmsys
;
.source somefile ;
, я получаюsyntax error near unexpected token elif
.Для моего .bashrc я использую следующий код:
Тогда я делаю что-то вроде:
Это некрасиво, но это работает. Вы можете использовать
case
вместо,if
если вы предпочитаете.источник
platform="$(uname | tr '[:upper:]' '[:lower:]')"
и тогда определенно обращаться с делом? Просто кажется странным жестко закодировать зависимость от очень конкретного вывода.Страница руководства bash говорит, что переменная OSTYPE хранит имя операционной системы:
Это установлено
linux-gnu
здесь.источник
os=${OSTYPE//[0-9.]/}
case $OSTYPE in darwin*) echo I am a Mac ;; esac
if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
$OSTYPE
Вы можете просто использовать предопределенную
$OSTYPE
переменную, например:Однако это не распознается старыми оболочками (такими как оболочка Борна ).
uname
Другой метод заключается в обнаружении платформы на основе
uname
команды.Смотрите следующий скрипт (готов к включению в .bashrc):
Вы можете найти практический пример в моем
.bashrc
.Вот аналогичная версия, используемая на Travis CI :
источник
uname
, Oracle затмил соглашение и поместил строку бесплатной версии с ихOSTYPE ==> solaris2.11
.uname
немного чище и меньше работы.Определить операционную систему и тип процессора не так просто, как в переносном режиме . У меня есть
sh
скрипт длиной около 100 строк, который работает на самых разных платформах Unix: любая система, которую я использовал с 1988 года.Ключевые элементы
uname -p
это тип процессора, но обычноunknown
на современных платформах Unix.uname -m
в некоторых системах Unix выдаст «имя аппаратного обеспечения»./bin/arch
, если он существует, обычно дает тип процессора.uname
без аргументов назовем операционную систему.В конце концов вам придется подумать о различиях между платформами и о том, как хорошо вы хотите их делать. Например, только , чтобы держать вещи простыми, я лечу
i386
черезi686
любой «Pentium*
» и любой «AMD*Athlon*
» все какx86
.My
~/.profile
запускает скрипт при запуске, который устанавливает одну переменную в строку, указывающую комбинацию процессора и операционной системы. У меня есть для конкретной платформыbin
,man
,lib
иinclude
каталоги , которые получают установленные на его основе. Затем я установил множество переменных среды. Так, например, может вызвать сценарий оболочки для переформатирования почты, например,$LIB/mailfmt
исполняемый двоичный файл для конкретной платформы.Если вы хотите срезать углы ,
uname -m
и обычныйuname
скажет вам, что вы хотите знать на многих платформах. Добавьте другие вещи, когда вам это нужно. (И используйтеcase
, а не вложенныеif
!)источник
uname -s
?Я рекомендую использовать этот полный код Bash
другие примеры примеров здесь: https://github.com/coto/server-easy-install/blob/master/lib/core.sh
источник
ls /etc
искать «бла-релиз» - что бы там ни было, это ОС Linux - CentOS, Ubuntu и т. д.В bash используйте
$OSTYPE
и$HOSTTYPE
, как задокументировано; это то, что я делаю. Если этого недостаточно, и если дажеuname
илиuname -a
(или другие соответствующие параметры) не дают достаточно информации, всегда есть скрипт config.guess из проекта GNU, созданный именно для этой цели.источник
Я бы предложил избежать некоторых из этих ответов. Не забывайте, что вы можете выбрать другие формы сравнения строк, которые бы прояснили большинство вариантов или ужасный код.
Одним из таких решений будет простая проверка, такая как:
if [[ "$OSTYPE" =~ ^darwin ]]; then
Который имеет дополнительное преимущество соответствия любой версии Darwin, несмотря на его суффикс версии. Это также работает для любых изменений, которые
Linux
можно ожидать.Вы можете увидеть некоторые дополнительные примеры в моих точечных файлах здесь
источник
Попробуйте использовать «uname». Например, в Linux: «uname -a».
Согласно странице руководства, uname соответствует SVr4 и POSIX, поэтому он должен быть доступен и в Mac OS X и Cygwin , но я не могу этого подтвердить.
Кстати: $ OSTYPE также установлен
linux-gnu
здесь :)источник
Я написал эти сахара в моем
.bashrc
:Так что я могу делать такие вещи, как:
источник
if_nix gnu
&if_os linux
.echo $OSTYPE
. Чтобы определить подсистему win 10 bash, единственное решение, которое я нашел, было проверить «Microsoft» в/proc/sys/kernel/osrelease
или
если вы хотите больше информации
источник
Я написал личную библиотеку Bash и среду сценариев, которая использует GNU shtool для довольно точного определения платформы.
GNU shtool - это очень переносимый набор скриптов, который содержит, помимо прочего, команду «shtool platform». Вот вывод:
на нескольких разных машинах:
Это дает довольно удовлетворительные результаты, как вы можете видеть. GNU shtool немного медленный, поэтому я на самом деле храню и обновляю идентификацию платформы в файле в системе, который вызывают мои скрипты. Это мой каркас, так что у меня работает, но ваш пробег может отличаться.
Теперь вам нужно найти способ упаковки shtool с вашими скриптами, но это не сложное упражнение. Вы также всегда можете воспользоваться выводом uname.
РЕДАКТИРОВАТЬ:
Я пропустил пост Тедди о
config.guess
(как-то). Это очень похожие сценарии, но не одинаковые. Лично я использую shtool и для других целей, и он работал довольно хорошо для меня.источник
Вы можете использовать следующее:
тогда вы можете использовать переменную ОС в вашем скрипте.
источник
uname -s
чем отличается отuname
?Ниже приведен подход к обнаружению ОС Linux на основе Debian и RedHat с использованием / etc / lsb-release и / etc / os-release (в зависимости от используемого вами варианта Linux) и выполнения простых действий на его основе.
Пример вывода для Ubuntu Linux:
источник
Это должно быть безопасно для использования на всех дистрибутивах.
Это производит что-то вроде этого.
Извлекать / присваивать переменным, как вы хотите
Примечание: на некоторых установках. Это также может дать вам некоторые ошибки, которые вы можете игнорировать.
источник
[user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)
cat: /etc/*release: No such file or directory
попробуй это:
источник
cat: /etc/*-release: No such file or directory
zsh: no matches found: /etc/*release
- это будет работать только для систем Linux, я полагаю ...Вы можете использовать следующее условие if и расширить его при необходимости:
источник
Я попробовал описанные выше сообщения в нескольких дистрибутивах Linux и обнаружил, что следующее работает лучше всего для меня. Это короткий, краткий и точный ответ, который также подходит для Bash в Windows.
источник
OS=$( ([[ -f /etc/*release ]] && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || echo "Unknown" )
это будет работать без ошибок.OS=$( $(compgen -G "/etc/*release" > /dev/null) && cat /etc/*release | grep ^NAME | tr -d 'NAME="') || $( echo "${OSTYPE//[0-9.]/}")
Я стараюсь хранить мои .bashrc и .bash_alias в общей папке, к которой имеют доступ все платформы. Вот как я решаю проблему в моем .bash_alias:
И у меня есть, например, .bash_alias_Linux с:
Таким образом, я разделяю платформу и переносимый код, вы можете сделать то же самое для .bashrc
источник
Это проверяет кучу
known
файлов, чтобы определить, является ли linux-дистрибутив Debian или Ubunu, и по умолчанию это$OSTYPE
переменная.источник
Выполнение следующих действий помогло правильно выполнить проверку для Ubuntu:
источник