Як виявити ОС за сценарієм Bash?


524

Я хотів би тримати мої .bashrcта .bash_loginфайли в контролі версій, щоб я міг їх використовувати між усіма комп'ютерами, якими я користуюся. Проблема полягає в тому, що у мене є деякі псевдоніми для ОС, тому я шукав спосіб визначити, чи працює сценарій на Mac OS X, Linux або Cygwin .

Який правильний спосіб виявити операційну систему в сценарії Bash ?


1
Ви коли-небудь думали обмінятися своїми конфігураціями? Я шукав налаштування такого ж типу :)
sorin

@sorin Я знаю, що це старий коментар, але якщо ти все ще цікавий, я будував ProfileGem, який дозволяє налаштувати підключувані середовища bash для всіх ваших машин.
dimo414

1
@ dimo414 profilegem, здається, переміщений сюди bitbucket.org/dimo414/profilegem . Що стосується спільного використання bash-конфігурацій, спробуйте деякі з цих проектів dotfiles
mahemoff

1
@mahemoff дякую за оновлене посилання, вибачте, що не можу редагувати свій коментар. Я вітаю відгуки або помилки, якщо ви експериментуєте з ProfileGem!
dimo414

На жаль, BitBucket відключає підтримку Mercurial, тому мені доведеться знову оновити своє посилання :( github.com/dimo414/ProfileGem - це новий дім.
dimo414

Відповіді:


521

Я думаю, що наступне має працювати. Я не впевнений, 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

7
У Windows ви отримаєте msysдля Git Bash / msysGit, а cygwinдля Cygwin
friederbluemle

1
Ця відповідь, включаючи спосіб виявлення для Windows, є хорошою. Я також використовую Mingw32, і він з'являється якmsys
d48,

2
Цікаво .. Mac OSX все одно дав би «дарвін».
jonathanbell

6
Щось, що мене спонукало, коли ви замінюєте коментар на команду - обов'язково закінчіть ;.
Вадим Перетокін

1
Коли я додаю команду типу source somefile ; , я отримую syntax error near unexpected token elif.
морська риба

291

Для мого .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
Чому ви встановлюєте платформу від unmestr, замість того, щоб просто використовувати unamestr?
csexton

80
Не використовуйте зворотні посилання, використовуйте новіший чіткий синтаксис: "unamestr = $ (uname)".
розмотується

14
Швидкий погляд, задній план може нагадувати рядок.
Harrison Powers

29
@ david-winiecki Тому що якщо вам потрібно вкладати команди, наприклад $ (command-1 $ (command-2))
Майкл Бартон,

3
Хіба не було б набагато краще зробити: platform="$(uname | tr '[:upper:]' '[:lower:]')"а потім неодмінно впоратися у випадку? Просто здається дивним жорсткий код залежності від дуже конкретного виводу.
Брендон Бак

274

На сторінці "bash" написано, що змінна OSTYPE зберігає назву операційної системи:

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

Тут встановлено linux-gnu.


5
Крім того, $ OSTYPE є 'darwin9.0' на моєму mac (Leopard) та 'cygwin' під Cygwin.
dF.

5
$ OSTYPE - darwin10.0 на SnowLeopard. WTF із доданою версією? Значить, проста заява справи не спрацює.
mxcl

16
Видалити це не так вже й багато:os=${OSTYPE//[0-9.]/}
ABach

86
case $OSTYPE in darwin*) echo I am a Mac ;; esac
трійка

36
@tripleee або для людей, яким зручніше синтаксис "if":if [[ $OSTYPE == darwin* ]]; then echo I am a Mac;fi
Rican7

157

$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

1
У чеку $ OSTYPE відсутня гілка для cygwin, яка вказувала б на машину Windows. Здійснення невідомої перевірки також не працює належним чином, на cygwin uname повертає "CYGWIN_NT-10.0", а на MinGW uname повертає "MINGW64_NT-10.0".
Метт Пеннінгтон

1
Псевдонім ls = '/ bin / ls -G' є насправді безпечним варіантом, в контексті ОС на базі ОС див. superuser.com/a/1299969/84662
Андрій Некулау

Я пропоную скористатися 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.

Моя ~/.profileзапускає сценарій при запуску, який встановлює одну змінну на рядок, що вказує на поєднання процесора та операційної системи. У мене є для конкретної платформи bin, man, libі includeкаталоги , які отримують встановлені на його основі. Тоді я встановлюю човновий набір змінних середовища. Так, наприклад, сценарій оболонки для переформатування пошти може викликати, наприклад, $LIB/mailfmtякий є виконавчим двійковим файлом, орієнтованим на платформу.

Якщо ви хочете вирізати кути , uname -mі звичайний unameскаже вам, що ви хочете знати на багатьох платформах. Додайте інші речі, коли вам це потрібно. (І використовувати case, не вкладати if!)


2
Згідно з командою uname , uname без параметра еквівалентно використанню параметра "-s": "-s Відображає ім'я системи. Цей прапор увімкнено за замовчуванням." Щоб бути явним, можна використовувати "uname -s" замість "uname". (Докладно розроблено у відповіді на
тему "

Чи є у вас посилання на github git або pastebin з цим сценарієм 100 для надійного виявлення архітектури ОС і процесора?
Ендрю Де Андраде

4
@AndrewDeAndrade Мені соромно викривати цей код перед громадськістю. pastebin.com/J66Lj6wf
Норман Рамзі

так як щодо uname -s?
Олександр Міллз

35

Я рекомендую використовувати цей повний баш-код

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 тощо
Chris Moschini

Я відредагував, тому що деякі посилання на змінну ОС були написані як "{$ OS}" Я змінив їх на "$ {OS}", це правильний шлях, я перевірив це
bazz

Чи могли б ви додати "echo $ {OS}" в самому кінці сценарію?
Олег Кокорін

10

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


10

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

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

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

Що має додаткову перевагу порівняння будь-якої версії Дарвіна, незважаючи на суфікс версії. Це також працює для будь-яких варіантів, які Linuxможна очікувати.

Ви можете побачити кілька додаткових прикладів у моїх точкових файлах тут


9

Спробуйте використовувати "uname". Наприклад, в Linux: "uname -a".

Відповідно до сторінки керівництва, унме відповідає SVr4 та POSIX, тому він повинен бути доступний і на Mac OS X та Cygwin , але я не можу це підтвердити.

BTW: Тут також встановлено $ OSTYPE linux-gnu:)


Без параметрів Uname друкує "Darwin" на Mac OS X (леопард). За допомогою -a він друкує масу додаткової інформації (версія ядра, архітектура та щось інше, що я не можу розшифрувати). Я не можу протестувати на cygwin
David Rodríguez - 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"

До речі, ці 9 рядків працюють на будь-якому Bash, що працює майже на будь-що. Немає шеллоутов і працює майже з будь-яким стилем персональних .bashrc (великі вкладені, якщо дерева / справи або безліч випадкових псевдонімів). ІМО, відбиває штани кожну відповідь над ним.
kfix

Поки що найбільш близький до завершення для включення Cygwin та інших BSD (в основному компіляція популярного * NIX)
HidekiAI

Повна для користувачів, які є актуальними сьогодні та запускають Bash. Користувачі AIX / HP-UX / IRIX / OpenVMS можуть задзвонити. Нова підсистема Windows для Linux працює з встановленням Ubuntu на складі amd64, тому вона повинна повернути істину для обох if_nix gnu& if_os linux.
kfix

1
@kfix так, так, підсистема win 10 bash видає "linux-gnu" для echo $OSTYPE. Щоб виявити підсистему win 10 bash, єдине знайдене /proc/sys/kernel/osrelease
нами


7

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

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 зі своїми сценаріями, але це не важка вправа. Ви також завжди можете повернутися на вихідний режим.

Редагувати:

Я пропустив пост Тедді про config.guess(якось). Це дуже схожі сценарії, але не однакові. Я особисто використовую shtool і для інших цілей, і він працює досить добре для мене.



6

Нижче подано підхід до виявлення ОС на базі Debian та RedHat, використовуючи / etc / lsb-реліз та / etc / os-реліз (залежно від аромату 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] 
...            

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

Примітка: у 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 та Дарвіном.
Томас Урбан

3

Ви можете скористатися наступним, якщо додаток, та розширити його за потребою:

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

2
У той час як цей фрагмент коду вітається, і може забезпечити деяку допомогу, було б значно покращено , якщо вона була придбана пояснення про те , як і те, чому це вирішує проблему. Пам’ятайте, що ви відповідаєте на запитання читачів у майбутньому, а не лише про людину, яка зараз запитує! Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються.
Toby Speight

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


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"

-1

Виконання наступних дій допомогло правильно перевірити ubuntu:

if [[ "$OSTYPE" =~ ^linux ]]; then
    sudo apt-get install <some-package>
fi

4
Що з іншими системами Linux, які не використовують apt-get?
Вільф

ubuntu - це дистрибутив, а не клас операційної системи.
тремтіння
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.