Как определить ОС из скрипта Bash?

526

Я хотел бы сохранить свои .bashrcи .bash_loginфайлы под контролем версий, чтобы я мог использовать их между всеми компьютерами, которые я использую. Проблема в том, что у меня есть некоторые псевдонимы для конкретных ОС, поэтому я искал способ определить, работает ли скрипт в Mac OS X, Linux или Cygwin .

Как правильно определить операционную систему в скрипте Bash ?

csexton
источник
1
Вы когда-нибудь думали поделиться своими конфигами? Я искал, чтобы получить такую ​​же настройку :)
Сорин
@sorin Я знаю, что это старый комментарий, но если вам все еще интересно, я собираю ProfileGem, который позволяет вам настраивать подключаемые среды bash для всех ваших машин.
dimo414
1
@ dimo414 profilegem, кажется, был перемещен сюда bitbucket.org/dimo414/profilegem . Что касается общего доступа к конфигам bash, попробуйте некоторые из этих проектов dotfiles: github.com/…
mahemoff
1
@mahemoff спасибо за обновленную ссылку, извините, я не могу отредактировать свой комментарий. Буду рад отзывам или ошибкам, если вы экспериментируете с ProfileGem!
dimo414
Увы, BitBucket отказывается от поддержки Mercurial, поэтому я должен обновить свою ссылку снова :( github.com/dimo414/ProfileGem - новый дом.
dimo414

Ответы:

523

Я думаю, что следующее должно работать. Я не уверен, win32хотя.

if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        # ...
elif [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac OSX
elif [[ "$OSTYPE" == "cygwin" ]]; then
        # POSIX compatibility layer and Linux environment emulation for Windows
elif [[ "$OSTYPE" == "msys" ]]; then
        # Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
elif [[ "$OSTYPE" == "win32" ]]; then
        # I'm not sure this can happen.
elif [[ "$OSTYPE" == "freebsd"* ]]; then
        # ...
else
        # Unknown.
fi
Timmmm
источник
7
На Windows вы получите msysдля Git Bash / msysGit, а cygwinдля Cygwin
Friederbluemle
1
Этот ответ, в том числе, как обнаружить для Windows, хорош. Я также использую Mingw32, и он выглядит какmsys
d48
2
Интересно .. Mac OSX все равно дал бы «дарвина».
Джонатанбелл
6
Что-то, что сбило меня с толку, когда вы заменяете комментарий командой - обязательно заканчивайте на ;.
Вадим Перетокин
1
Когда я добавляю команду вроде source somefile ; , я получаю syntax error near unexpected token elif.
oarfish
292

Для моего .bashrc я использую следующий код:

platform='unknown'
unamestr=`uname`
if [[ "$unamestr" == 'Linux' ]]; then
   platform='linux'
elif [[ "$unamestr" == 'FreeBSD' ]]; then
   platform='freebsd'
fi

Тогда я делаю что-то вроде:

if [[ $platform == 'linux' ]]; then
   alias ls='ls --color=auto'
elif [[ $platform == 'freebsd' ]]; then
   alias ls='ls -G'
fi

Это некрасиво, но это работает. Вы можете использовать caseвместо, ifесли вы предпочитаете.

Николас Мартьянов
источник
6
Почему вы устанавливаете платформу из unamestr, а не просто используете unamestr?
csexton
80
Не используйте обратные пометки, используйте более понятный синтаксис: "unamestr = $ (uname)".
расслабиться
15
Беглый взгляд, на первый взгляд, напоминает строку.
Харрисон Пауэрс
29
@ david-winiecki Потому что, если вам нужно вложить команды, например, $ (command-1 $ (command-2))
Майкл Бартон
4
Разве это не было бы намного лучше сделать: platform="$(uname | tr '[:upper:]' '[:lower:]')"и тогда определенно обращаться с делом? Просто кажется странным жестко закодировать зависимость от очень конкретного вывода.
Брэндон Бак
274

Страница руководства bash говорит, что переменная OSTYPE хранит имя операционной системы:

OSTYPEАвтоматически устанавливается в строку, описывающую операционную систему, в которой выполняется bash. Значение по умолчанию зависит от системы.

Это установлено linux-gnuздесь.

Йоханнес Шауб - Литб
источник
5
Кроме того, $ OSTYPE - это «darwin9.0» на моем Mac (Leopard) и «cygwin» под Cygwin.
ДФ.
5
$ OSTYPE - это darwin10.0 на SnowLeopard. WTF с добавленной версией? Означает, что простое утверждение случая не будет работать.
mxcl
16
Это не так уж важно, чтобы удалить его:os=${OSTYPE//[0-9.]/}
ABach
86
case $OSTYPE in darwin*) echo I am a Mac ;; esac
tripleee
36
@tripleee или для людей, которым более удобен синтаксис «если»:if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
Rican7
159

$OSTYPE

Вы можете просто использовать предопределенную $OSTYPEпеременную, например:

case "$OSTYPE" in
  solaris*) echo "SOLARIS" ;;
  darwin*)  echo "OSX" ;; 
  linux*)   echo "LINUX" ;;
  bsd*)     echo "BSD" ;;
  msys*)    echo "WINDOWS" ;;
  *)        echo "unknown: $OSTYPE" ;;
esac

Однако это не распознается старыми оболочками (такими как оболочка Борна ).


uname

Другой метод заключается в обнаружении платформы на основе unameкоманды.

Смотрите следующий скрипт (готов к включению в .bashrc):

# Detect the platform (similar to $OSTYPE)
OS="`uname`"
case $OS in
  'Linux')
    OS='Linux'
    alias ls='ls --color=auto'
    ;;
  'FreeBSD')
    OS='FreeBSD'
    alias ls='ls -G'
    ;;
  'WindowsNT')
    OS='Windows'
    ;;
  'Darwin') 
    OS='Mac'
    ;;
  'SunOS')
    OS='Solaris'
    ;;
  'AIX') ;;
  *) ;;
esac

Вы можете найти практический пример в моем.bashrc .


Вот аналогичная версия, используемая на Travis CI :

case $(uname | tr '[:upper:]' '[:lower:]') in
  linux*)
    export TRAVIS_OS_NAME=linux
    ;;
  darwin*)
    export TRAVIS_OS_NAME=osx
    ;;
  msys*)
    export TRAVIS_OS_NAME=windows
    ;;
  *)
    export TRAVIS_OS_NAME=notset
    ;;
esac
kenorb
источник
1
В проверке $ OSTYPE отсутствует ветка для cygwin, которая указывает на машину с Windows. Проверка uname также не будет работать должным образом, на cygwin uname возвращает «CYGWIN_NT-10.0», а на MinGW uname возвращает «MINGW64_NT-10.0».
Мэтт Пеннингтон
1
псевдоним ls = '/ bin / ls -G' на самом деле является безопасным вариантом, в контексте
подделок на
Я предлагаю использовать uname, Oracle затмил соглашение и поместил строку бесплатной версии с их OSTYPE ==> solaris2.11. unameнемного чище и меньше работы.
будет
37

Определить операционную систему и тип процессора не так просто, как в переносном режиме . У меня есть 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!)

Норман Рэмси
источник
2
Согласно команде uname , uname без параметра эквивалентно использованию параметра "-s": "-s Отображает имя системы. Этот флаг включен по умолчанию.". Чтобы быть явным, можно использовать «uname -s» вместо «uname». (Разработано в ответ на «Помощь по выходу Shell» )
Питер Мортенсен,
У вас есть ссылка на github git или pastebin с этим 100 скриптом для надежного определения архитектуры ОС и процессора?
Эндрю Де Андраде
4
@AndrewDeAndrade Мне стыдно обнародовать этот код. pastebin.com/J66Lj6wf
Норман Рэмси,
так как насчет uname -s?
Александр Миллс
35

Я рекомендую использовать этот полный код Bash

lowercase(){
    echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
}

OS=`lowercase \`uname\``
KERNEL=`uname -r`
MACH=`uname -m`

if [ "{$OS}" == "windowsnt" ]; then
    OS=windows
elif [ "{$OS}" == "darwin" ]; then
    OS=mac
else
    OS=`uname`
    if [ "${OS}" = "SunOS" ] ; then
        OS=Solaris
        ARCH=`uname -p`
        OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
    elif [ "${OS}" = "AIX" ] ; then
        OSSTR="${OS} `oslevel` (`oslevel -r`)"
    elif [ "${OS}" = "Linux" ] ; then
        if [ -f /etc/redhat-release ] ; then
            DistroBasedOn='RedHat'
            DIST=`cat /etc/redhat-release |sed s/\ release.*//`
            PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/SuSE-release ] ; then
            DistroBasedOn='SuSe'
            PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
            REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
        elif [ -f /etc/mandrake-release ] ; then
            DistroBasedOn='Mandrake'
            PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
            REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
        elif [ -f /etc/debian_version ] ; then
            DistroBasedOn='Debian'
            DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F=  '{ print $2 }'`
            PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F=  '{ print $2 }'`
            REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F=  '{ print $2 }'`
        fi
        if [ -f /etc/UnitedLinux-release ] ; then
            DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
        fi
        OS=`lowercase $OS`
        DistroBasedOn=`lowercase $DistroBasedOn`
        readonly OS
        readonly DIST
        readonly DistroBasedOn
        readonly PSUEDONAME
        readonly REV
        readonly KERNEL
        readonly MACH
    fi

fi

другие примеры примеров здесь: https://github.com/coto/server-easy-install/blob/master/lib/core.sh

Кото
источник
1
Вы пропустили функцию нижнего регистра, я обновил ваш ответ для вас.
Робин Кловерс
1
Когда вы знаете, что это Linux, если вы просто копаетесь (не пытаясь автоматизировать обнаружение), кажется, что самый простой шаг - просто ls /etcискать «бла-релиз» - что бы там ни было, это ОС Linux - CentOS, Ubuntu и т. д.
Крис Москини
1
Я отредактировал, потому что некоторые ссылки на переменную OS были записаны как "{$ OS}", я изменил их на "$ {OS}", это правильный путь, я протестировал его
bazz
Не могли бы вы добавить «echo $ {OS}» в самом конце скрипта?
Олег Кокорин
10

В bash используйте $OSTYPEи $HOSTTYPE, как задокументировано; это то, что я делаю. Если этого недостаточно, и если даже unameили uname -a(или другие соответствующие параметры) не дают достаточно информации, всегда есть скрипт config.guess из проекта GNU, созданный именно для этой цели.

Тедди
источник
10

Я бы предложил избежать некоторых из этих ответов. Не забывайте, что вы можете выбрать другие формы сравнения строк, которые бы прояснили большинство вариантов или ужасный код.

Одним из таких решений будет простая проверка, такая как:

if [[ "$OSTYPE" =~ ^darwin ]]; then

Который имеет дополнительное преимущество соответствия любой версии Darwin, несмотря на его суффикс версии. Это также работает для любых изменений, которые Linuxможно ожидать.

Вы можете увидеть некоторые дополнительные примеры в моих точечных файлах здесь

Акива
источник
9

Попробуйте использовать «uname». Например, в Linux: «uname -a».

Согласно странице руководства, uname соответствует SVr4 и POSIX, поэтому он должен быть доступен и в Mac OS X и Cygwin , но я не могу этого подтвердить.

Кстати: $ OSTYPE также установлен linux-gnuздесь :)

Жоао да Силва
источник
Без параметров uname печатает «Darwin» на Mac OS X (леопард). С -a он печатает много дополнительной информации (версию ядра, архитектуру и что-то еще, что я не могу расшифровать). Я не могу проверить на cygwin
Дэвид Родригес - dribeas
8

Я написал эти сахара в моем .bashrc:

if_os () { [[ $OSTYPE == *$1* ]]; }
if_nix () { 
    case "$OSTYPE" in
        *linux*|*hurd*|*msys*|*cygwin*|*sua*|*interix*) sys="gnu";;
        *bsd*|*darwin*) sys="bsd";;
        *sunos*|*solaris*|*indiana*|*illumos*|*smartos*) sys="sun";;
    esac
    [[ "${sys}" == "$1" ]];
}

Так что я могу делать такие вещи, как:

if_nix gnu && alias ls='ls --color=auto' && export LS_COLORS="..."
if_nix bsd && export CLICOLORS=on && export LSCOLORS="..."
if_os linux && alias psg="ps -FA | grep" #alternative to pgrep
if_nix bsd && alias psg="ps -alwx | grep -i" #alternative to pgrep
if_os darwin && alias finder="open -R"
kfix
источник
Кстати, эти 9 строк работают на любом Bash, работающем на большинстве чего угодно. Нет оболочки и работает практически с любым стилем личных .bashrc (большие вложенные деревья if / case или множество случайных псевдонимов). ИМО, отбивает штаны от каждого ответа над ним.
kfix
Пока что ближе всего к тому, чтобы включить Cygwin и другие BSD (в основном компиляция популярной * NIX)
HidekiAI
Заполните для пользовательских областей, которые актуальны сегодня и запустите Bash. Пользователи AIX / HP-UX / IRIX / OpenVMS могут подключиться. Новая подсистема Windows для Linux запускает стандартную установку Ubuntu amd64, поэтому она должна возвращать true для обоих if_nix gnu& if_os linux.
kfix
1
@kfix да, верно, подсистема win 10 bash выводит "linux-gnu" для echo $OSTYPE. Чтобы определить подсистему win 10 bash, единственное решение, которое я нашел, было проверить «Microsoft» в/proc/sys/kernel/osrelease
Jpnh
7
uname

или

uname -a

если вы хотите больше информации

Федерико А. Рампони
источник
7

Я написал личную библиотеку Bash и среду сценариев, которая использует GNU shtool для довольно точного определения платформы.

GNU shtool - это очень переносимый набор скриптов, который содержит, помимо прочего, команду «shtool platform». Вот вывод:

shtool platform -v -F "%sc (%ac) %st (%at) %sp (%ap)"

на нескольких разных машинах:

Mac OS X Leopard: 
    4.4BSD/Mach3.0 (iX86) Apple Darwin 9.6.0 (i386) Apple Mac OS X 10.5.6 (iX86)

Ubuntu Jaunty server:
    LSB (iX86) GNU/Linux 2.9/2.6 (i686) Ubuntu 9.04 (iX86)

Debian Lenny:
    LSB (iX86) GNU/Linux 2.7/2.6 (i686) Debian GNU/Linux 5.0 (iX86)

Это дает довольно удовлетворительные результаты, как вы можете видеть. GNU shtool немного медленный, поэтому я на самом деле храню и обновляю идентификацию платформы в файле в системе, который вызывают мои скрипты. Это мой каркас, так что у меня работает, но ваш пробег может отличаться.

Теперь вам нужно найти способ упаковки shtool с вашими скриптами, но это не сложное упражнение. Вы также всегда можете воспользоваться выводом uname.

РЕДАКТИРОВАТЬ:

Я пропустил пост Тедди о config.guess(как-то). Это очень похожие сценарии, но не одинаковые. Лично я использую shtool и для других целей, и он работал довольно хорошо для меня.

оружие
источник
7

Вы можете использовать следующее:

OS=$(uname -s)

тогда вы можете использовать переменную ОС в вашем скрипте.

Четан Капур
источник
Вы можете объяснить, uname -sчем отличается от uname?
Александр Миллс
@AlexanderMills -s, --kernel-name напечатать имя ядра
Четан Капур
6

Ниже приведен подход к обнаружению ОС Linux на основе Debian и RedHat с использованием / etc / lsb-release и / etc / os-release (в зависимости от используемого вами варианта Linux) и выполнения простых действий на его основе.

#!/bin/bash
set -e

YUM_PACKAGE_NAME="python python-devl python-pip openssl-devel"
DEB_PACKAGE_NAME="python2.7 python-dev python-pip libssl-dev"

 if cat /etc/*release | grep ^NAME | grep CentOS; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on CentOS"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Red; then
    echo "==============================================="
    echo "Installing packages $YUM_PACKAGE_NAME on RedHat"
    echo "==============================================="
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Fedora; then
    echo "================================================"
    echo "Installing packages $YUM_PACKAGE_NAME on Fedorea"
    echo "================================================"
    yum install -y $YUM_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Ubuntu; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Ubuntu"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Debian ; then
    echo "==============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Debian"
    echo "==============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Mint ; then
    echo "============================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Mint"
    echo "============================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 elif cat /etc/*release | grep ^NAME | grep Knoppix ; then
    echo "================================================="
    echo "Installing packages $DEB_PACKAGE_NAME on Kanoppix"
    echo "================================================="
    apt-get update
    apt-get install -y $DEB_PACKAGE_NAME
 else
    echo "OS NOT DETECTED, couldn't install package $PACKAGE"
    exit 1;
 fi

exit 0

Пример вывода для Ubuntu Linux:

delivery@delivery-E5450$ sudo sh detect_os.sh
[sudo] password for delivery: 
NAME="Ubuntu"
===============================================
Installing packages python2.7 python-dev python-pip libssl-dev on Ubuntu
===============================================
Ign http://dl.google.com stable InRelease
Get:1 http://dl.google.com stable Release.gpg [916 B]                          
Get:2 http://dl.google.com stable Release [1.189 B] 
...            
Exequiel Barrirero
источник
5

Это должно быть безопасно для использования на всех дистрибутивах.

$ cat /etc/*release

Это производит что-то вроде этого.

     DISTRIB_ID=LinuxMint
     DISTRIB_RELEASE=17
     DISTRIB_CODENAME=qiana
     DISTRIB_DESCRIPTION="Linux Mint 17 Qiana"
     NAME="Ubuntu"
     VERSION="14.04.1 LTS, Trusty Tahr"
     ID=ubuntu
     ID_LIKE=debian
     PRETTY_NAME="Ubuntu 14.04.1 LTS"
     VERSION_ID="14.04"
     HOME_URL="http://www.ubuntu.com/"
     SUPPORT_URL="http://help.ubuntu.com/"
     BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

Извлекать / присваивать переменным, как вы хотите

Примечание: на некоторых установках. Это также может дать вам некоторые ошибки, которые вы можете игнорировать.

     cat: /etc/upstream-release: Is a directory
RJ
источник
Примечание: на CentOS это дает[user@host ~]$ cat /etc/*release CentOS release 6.4 (Final) CentOS release 6.4 (Final) CentOS release 6.4 (Final)
cfstras
Да, вывод, который я разместил, был примером с одного из моих ноутбуков, а не со статичным контентом, который вы видите повсюду.
RJ
Просто добавил, что никто не подумает, что результат всегда в одной и той же форме :)
cfstras
1
+1 Я использую set -e в начале скрипта (таким образом, это решение не работает doxer.org/linux-shell-centos-debian-ostype ). И другие решения не специально CentOS. Но я нашел эту ссылку, которая подтвердила этот ответ unix.stackexchange.com/a/92212
gihanchanuka
4
не работает для Mac:cat: /etc/*release: No such file or directory
eridal
3

попробуй это:

DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"')
echo "Determined platform: $DISTRO"
Александр Некрасов
источник
На macOS я получаюcat: /etc/*-release: No such file or directory
csexton
@ csexton действительно, я получаю то же самое: zsh: no matches found: /etc/*release- это будет работать только для систем Linux, я полагаю ...
Александр Некрасов
Этот ответ работает только для Linux, наверняка. Но другие ответы способны обнаружить Linux в отличие от других систем. Это базовое открытие совсем не помогает в обнаружении конкретного дистрибутива Linux, оно так же важно, как и различие между FreeBSD и Darwin.
Томас Урбан
3

Вы можете использовать следующее условие if и расширить его при необходимости:

if [ "${OSTYPE//[0-9.]/}" == "darwin" ]
then
    aminute_ago="-v-1M"
elif  [ "${OSTYPE//[0-9.]/}" == "linux-gnu" ]
then
    aminute_ago="-d \"1 minute ago\""
fi
Тахсин Туркоз
источник
2

Я попробовал описанные выше сообщения в нескольких дистрибутивах Linux и обнаружил, что следующее работает лучше всего для меня. Это короткий, краткий и точный ответ, который также подходит для Bash в Windows.

OS=$(cat /etc/*release | grep ^NAME | tr -d 'NAME="') #$ echo $OS # Ubuntu
intellilogic
источник
2
Хотя этот фрагмент кода приветствуется и может оказать некоторую помощь, он будет значительно улучшен, если в него будет включено объяснение того, как и почему это решает проблему. Помните, что вы отвечаете на вопрос для читателей в будущем, а не только для того, кто спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение и указать, какие ограничения и предположения применяются.
Тоби Спейт
1
Кажется хорошим и лаконичным для большинства систем Linux, но, к сожалению, это приведет к ошибке в MacOS. Возможно, это более "обнаружить аромат дистрибутива Linux из Bash
csexton
1
@csexton 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.]/}")
Кузеко
@Kuzeko К сожалению, я все еще получаю ошибки при запуске этого на macOS.
csexton
1

Я стараюсь хранить мои .bashrc и .bash_alias в общей папке, к которой имеют доступ все платформы. Вот как я решаю проблему в моем .bash_alias:

if [[ -f (name of share)/.bash_alias_$(uname) ]]; then
    . (name of share)/.bash_alias_$(uname)
fi

И у меня есть, например, .bash_alias_Linux с:

alias ls='ls --color=auto'

Таким образом, я разделяю платформу и переносимый код, вы можете сделать то же самое для .bashrc

ericcurtin
источник
1

Это проверяет кучу knownфайлов, чтобы определить, является ли linux-дистрибутив Debian или Ubunu, и по умолчанию это $OSTYPEпеременная.

os='Uknown'
unamestr="${OSTYPE//[0-9.]/}"
os=$( compgen -G "/etc/*release" > /dev/null  && cat /etc/*release | grep ^NAME | tr -d 'NAME="'  ||  echo "$unamestr")

echo "$os"
Kuzeko
источник
-1

Выполнение следующих действий помогло правильно выполнить проверку для Ubuntu:

if [[ "$OSTYPE" =~ ^linux ]]; then
    sudo apt-get install <some-package>
fi
Дрема
источник
4
А как насчет других систем Linux, которые не используют apt-get?
Уилф
Ubuntu - это дистрибутив, а не класс операционной системы.
дрожание