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

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

Каков правильный способ определения операционной system в сценарии Bash?


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

  if [["$ OSTYPE" == "linux-gnu" *]];  затем # ... elif [["$ OSTYPE" == "дарвин" *]];  затем # Mac OSXelif [["$ OSTYPE" == "cygwin"]];  затем # уровень совместимости POSIX и эмуляция среды Linux для Windowselif [["$ OSTYPE" == "msys"]];  then # Облегченная оболочка и утилиты GNU, скомпилированные для Windows (часть MinGW) elif [["$ OSTYPE" == "win32"]];  then # Я не уверен, что такое может случиться.elif [["$ OSTYPE" == "freebsd" *]];  затем # ... else # Unknown.fi  

300

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

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

Затем я делаю что-то вроде:

  if [[$ platform ==' linux '  ]];  затем псевдоним ls = 'ls --color = auto'elif [[$ platform ==' freebsd ']];  затем псевдоним ls = 'ls -G'fi  

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

Улучшите этот ответ
отредактировано 27 апреля ’16 в 22:37
the Tin Man
149k3232 золотых знака193193 серебряных знака275275 бронзовых знаков
ответил 26 декабря ’08 в 20:36
  • 6
    Почему вы устанавливаете платформу из unamestr, а не просто используете unamestr? — csexton, 26 дек, 22:14
  • 81
    Не используйте обратные кавычки, используйте новый, более четкий синтаксис: «unamestr = $ (uname)». — раскрутка 14 января 2009 г., 11:38
  • 15
    На первый взгляд обратные кавычки могут напоминать строку. — Харрисон Пауэрс, 31 марта 2014, 0:53
  • 29
    @ david-winiecki Потому что, если вам нужно вложить команды, например $ (command-1 $ (command-2)) — Майкл Бартон, 25 февраля 2015, 19:45
  • 5
    Разве не лучше было бы сделать: platform = "$ (uname | tr '[: upper:]' ' [: lower:] ') ", а затем обязательно обработать в случае? Просто кажется странным жестко закодировать зависимость от очень конкретного вывода. — Брэндон Бак, 17 дек. ’15 в 17:35
| показать 5 дополнительных комментариев

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

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

Затем я делаю что-то вроде:

  if [[$ platform ==' linux '  ]];  затем псевдоним ls = 'ls --color = auto'elif [[$ platform ==' freebsd ']];  затем псевдоним ls = 'ls -G'fi  

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


280

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

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

Здесь установлено значение linux-gnu . jio

Улучшите это ответ
изменён 15 окт. в 18:11
Йокович
311 бронзовый значок
ответил 26 декабря ’08, 20:31
  • 5
    Кроме того, $ OSTYPE — это ‘darwin9.0’ на моем Mac (Leopard) и ‘cygwin’ в Cygwin. — dF. 26 дек., 20:33
  • 5
    $ OSTYPE — это darwin10.0 на SnowLeopard. WTF с добавленной версией? Означает, что простой оператор case не работает. — mxcl, 03 дек. 2009, 14:52
  • 16
    Удалить его не так уж и сложно: os = $ {OSTYPE//[0-9. ]/} — ABach 28 сен., 21:47
  • 88
    case $ OSTYPE in darwin *) echo Я Mac ;; esac — tripleee 17 февраля 2012, 18:14
  • 37
    @tripleee или для людей, которым удобнее использовать синтаксис «если»: if [[$ OSTYPE == darwin *]]; затем эхо "Я Mac"; fi — Rican7 5 фев. 2013, в 19:28
| показать 5 дополнительных комментариев

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

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

Здесь установлено значение linux-gnu . jio


183

$ OSTYPE

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

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

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


uname

Другой метод — определить платформу на основе uname команда.

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

  # Обнаружение платформы (аналогично $ OSTYPE) OS =  "` uname` "case $ OS в 'Linux') OS = 'Linux' псевдоним ls = 'ls --color = auto' ;;  'FreeBSD') OS = 'FreeBSD' псевдоним ls = 'ls -G' ;;  'WindowsNT') OS = 'Windows' ;;  'Дарвин') OS = 'Mac' ;;  'SunOS') OS = 'Solaris' ;;  'AIX') ;;  *) ;; esac  

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


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

  case $ (uname | tr '[: upper:]'  '[: lower:]') в linux *) export TRAVIS_OS_NAME = linux ;;  darwin *) export TRAVIS_OS_NAME = osx ;;  msys *) экспорт TRAVIS_OS_NAME = windows ;;  *) экспорт TRAVIS_OS_NAME = notset ;; esac  

Улучшите этот ответ
отредактировано 9 мая ’19 в 9:16
ответил 25 августа 2013 в 23:43
  • 1
    При проверке $ OSTYPE отсутствует ветка для cygwin, которая указывает на машину с Windows. Проверка uname также не будет работать должным образом, на cygwin uname возвращается «CYGWIN_NT-10.0», а на MinGW uname возвращает «MINGW64_NT-10.0». — Мэтт Пеннингтон, 13 марта 2017 г., 15:19
  • 1
    alias ls = ‘/bin/ls -G’ на самом деле является безопасным вариантом, в контексте фагов на базе ОС см. superuser.com/a/1299969/84662 — Андрей Некулау 2 марта 2018 г., 21:43
  • Предлагаю используя uname , Oracle скрыла соглашение и поместила строку бесплатной версии со своим OSTYPE ==> solaris2.11 . uname немного чище и требует меньше работы. — будет 8 мая ’19 в 23:52
добавить комментарий |

$OSTYPE

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

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

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


uname

Другой метод — определить платформу на основе uname команда.

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

  # Обнаружение платформы (аналогично $ OSTYPE) OS =  "` uname` "case $ OS в 'Linux') OS = 'Linux' псевдоним ls = 'ls --color = auto' ;;  'FreeBSD') OS = 'FreeBSD' псевдоним ls = 'ls -G' ;;  'WindowsNT') OS = 'Windows' ;;  'Дарвин') OS = 'Mac' ;;  'SunOS') OS = 'Solaris' ;;  'AIX') ;;  *) ;; esac  

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


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

  case $ (uname | tr '[: upper:]'  '[: lower:]') в linux *) export TRAVIS_OS_NAME = linux ;;  darwin *) export TRAVIS_OS_NAME = osx ;;  msys *) экспорт TRAVIS_OS_NAME = windows ;;  *) экспорт TRAVIS_OS_NAME = notset ;; esac  

38

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

Улучшите этот ответ
отредактировано 26 апреля 2018 в 22:51
26 дек. ’08 в 21:07
  • 2
    Согласно команде uname , uname без параметра эквивалентно использованию параметра «-s»: «-s Отображает имя системы. По умолчанию этот флаг установлен».. Чтобы быть точным, можно использовать «uname -s» вместо «uname». (В некоторой степени проработано в ответ на «Справка по выводам оболочки» ) — Питер Мортенсен 19 февраля 2012 г., 11:37
  • У вас есть ссылка на github git или pastebin с этим 100 скриптов для надежного определения ОС и архитектуры процессора? — Эндрю Де Андраде, 10 сен., 18:55
  • 4
    @AndrewDeAndrade Мне стыдно раскрывать этот код публике. pastebin.com/J66Lj6wf — Норман Рэмси, 14 сен 2013, 20:44
  • так как насчет uname -s ? — Александр Миллс 13 июл. ’18 в 7:20
добавить комментарий |

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


38

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

  lowercase () {echo "$ 1  "|  sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"} OS = `нижний регистр ` uname  `KERNEL =` uname -r`MACH = `uname -m`if [" {$ OS} "==" windowsnt "];  затем OS = windowselif ["{$ OS}" == "дарвин"];  тогда OS = macelse OS = `uname` if [" $ {OS} "=" SunOS "];  тогда OS = Solaris ARCH = `uname -p` OSSTR =" $ {OS} $ {REV} ($ {ARCH} `uname -v`)" elif ["$ {OS}" = "AIX"];  затем OSSTR = "$ {OS}` oslevel` (`oslevel -r`)" elif ["$ {OS}" = "Linux"];  тогда если [-f/etc/redhat-release];  затем 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];  затем 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];  затем 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];  затем 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];  затем DIST = "$ {DIST} [` cat/etc/UnitedLinux-release | tr " n" '' | sed s/VERSION. *//`]" fi OS = `нижний регистр $ OS` DistroBasedOn =` нижний регистр $  DistroBasedOn` только для чтения ОС только для чтения DIST только для чтения DistroBasedOn только для чтения PSUEDONAME только для чтения REV только для чтения KERNEL только для чтения MACH fifiecho $ OSecho $ KERNELecho $ MACH  

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

Улучшите этот ответ
отредактировано 16 июля ’20 в 19:47
ответил 25 сентября 2010 г., 7:00
  • 1
    Вы пропустили строчную функцию, я обновил ваш ответ для вас. — Робин Клоуэрс, 17 февраля 2012 г., 17:28
  • 1
    Как только вы узнаете, что это Linux, если вы просто ковыряетесь (не пытаясь автоматизировать поиск), кажется, что проще всего просто ls/etc и посмотреть для «бла-релиз» — что бы там ни было, это ОС Linux — CentOS, Ubuntu и т. д. — Крис Москини, 8 августа 2014 г., 18:14
  • 1
    Я отредактировал, потому что некоторые ссылки на переменную ОС были записаны как «{$ OS}» Я изменил их на «$ {OS}», правильно, я проверил это — bazz 11 августа 2014, 19:51
  • 2
    Не могли бы вы добавить «echo $ {OS}» в самый конец скрипта? — Олег Кокорин 19 мая ’17 в 13:54
  • 1
    Это большая работа для большой загадки в конце (никакой информации не печатается). Во-вторых, в конце требуется echo $ OS . — Alex Hall 14 июля ’20 в 0:33
| показать 1 дополнительный комментарий

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

  нижний регистр () {echo "$ 1" |  sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"} OS = `нижний регистр ` uname  `KERNEL =` uname -r`MACH = `uname -m`if [" {$ OS} "==" windowsnt "];  затем OS = windowselif ["{$ OS}" == "дарвин"];  тогда OS = macelse OS = `uname` if [" $ {OS} "=" SunOS "];  тогда OS = Solaris ARCH = `uname -p` OSSTR =" $ {OS} $ {REV} ($ {ARCH} `uname -v`)" elif ["$ {OS}" = "AIX"];  затем OSSTR = "$ {OS}` oslevel` (`oslevel -r`)" elif ["$ {OS}" = "Linux"];  тогда если [-f/etc/redhat-release];  затем 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];  затем 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];  затем 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];  затем 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];  затем DIST = "$ {DIST} [` cat/etc/UnitedLinux-release | tr " n" '' | sed s/VERSION. *//`]" fi OS = `нижний регистр $ OS` DistroBasedOn =` нижний регистр $  DistroBasedOn` только для чтения ОС только для чтения DIST только для чтения DistroBasedOn только для чтения PSUEDONAME только для чтения REV только для чтения KERNEL только для чтения MACH fifiecho $ OSecho $ KERNELecho $ MACH  

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


12

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

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

if [["$ OSTYPE" = ~ ^ darwin]]; затем

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

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

Улучшите этот ответ
ответил 3 мая ’12 в 21:59
добавить комментарий |

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

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

if [["$ OSTYPE" = ~ ^ darwin]]; затем

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

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


10

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

Улучшите этот ответ
ответил 14 января ’09 в 11:24
добавить комментарий |

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


10

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

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

Кстати: $ OSTYPE также имеет значение linux-gnu здесь 🙂

Улучшить этот ответ
отредактировал 19 февраля 2012 в 15:38
Питер Мортенсен
27.4k2121 золотой знак9393 серебряных знака123123 бронзовых знака
ответил 26 дек. div>
  • Без параметров uname печатает ‘Darwin’ в Mac OS X (леопард). С -a он выводит много дополнительной информации (версия ядра, архитектура и что-то еще, что я не могу расшифровать). Я не могу протестировать cygwin — Дэвид Родригес — dribeas 26 дек. ’08 в 20:51
добавить комментарий |

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

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

Кстати: $ OSTYPE также имеет значение linux-gnu здесь 🙂


8

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

  if_os () {[[$ OSTYPE == * $ 1 *]];  } if_nix () {case "$ OSTYPE" в * 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 pgrepif_nix bsd && alias psg =" ps -alwx | grep -i "#alternative to pgrepif_os darwin && alias finder =" open -R " 

Улучшите этот ответ
отредактировал 24 марта 2015 г. в 18:00
gniourf_gniourf
37.6k77 золотых знаков7878 серебряных знаков9090 бронзовых знаков
ответил 24 марта 2015, 17:52
  • Кстати, эти 9 строк работают на любом Bash, запущенном практически на чем угодно . Нет оболочки и работает практически с любым стилем личного .bashrc (большие вложенные деревья if/case или множество случайных псевдонимов). ИМО, бьет по штанам каждый ответ выше. — kfix 02 сентября 2015 г., 0:00
  • На данный момент наиболее близок к завершению для включения Cygwin и других BSD (в основном компиляция популярных * NIX) — HidekiAI 11 апр. ’16 в 19:08
  • Завершено для актуальных сегодня пользовательских областей и запускает Bash. Пользователи AIX/HP-UX/IRIX/OpenVMS могут вмешаться. Новая подсистема Windows для Linux запускает стандартную установку Ubuntu amd64, поэтому она должна возвращать true для обоих if_nix gnu и if_os linux . — kfix 22 апр. ’16 в 23:38
  • 1
    @kfix да, верно, подсистема win 10 bash выводит «linux-gnu» для echo $ OSTYPE . Единственное решение, которое я нашел для обнаружения подсистемы win 10 bash, — это проверить наличие «Microsoft» в /proc/sys/kernel/osrelease — Jpnh 23 марта ’17 в 11:07
добавить комментарий |

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

  if_os () {[[$ OSTYPE == * $ 1 *]];  } if_nix () {case "$ OSTYPE" в * 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 pgrepif_nix bsd && alias psg =" ps -alwx | grep -i "#alternative to pgrepif_os darwin && alias finder =" open -R " 

7

uname 

или

  uname -a  

, если вам нужна дополнительная информация

Улучшите этот ответ
ответил 26 дек. ’08 в 20:33
добавить комментарий |

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: 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.

EDIT:

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

Улучшите этот ответ
отредактировано 19 февраля 2012 г. в 15:41
Peter Mortensen
27.4k2121 золотых знаков9393 серебряных знака123123 бронзовых знака
ответил 12 марта ’09 в 19:15
добавить комментарий |

Я написал личную библиотеку 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: 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.

EDIT:

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


7

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

  OS = $ (uname -s)  

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

Улучшите этот ответ
ответил 23 ноября ’17 в 11:42
  • не могли бы вы объяснить, чем uname -s отличается от uname ? — Александр Миллс, 13 июля 2018 г., 07:12
  • @AlexanderMills -s, —kernel-name вывести имя ядра — Chetan kapoor 13 июл 2018, в 9:57
добавить комментарий |

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

  OS = $ (uname -s)  

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


6

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

  $ cat/etc/* release  

В результате получается что-то вроде этого.

  DISTRIB_ID  = LinuxMint DISTRIB_RELEASE = 17 DISTRIB_CODENAME = qiana DISTRIB_DESCR  IPTION = "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: это каталог  

Улучшить этот ответ
ответ дан 21 авг.
  • Примечание: в CentOS это дает [user @ host ~] $ cat/etc/* выпуск CentOS, выпуск 6.4 (окончательный) CentOS, выпуск 6.4 (окончательный) CentOS, выпуск 6.4 (окончательный) — cfstras, 8 сен 2014, 12:16
  • Да, я опубликовал пример с одного из моих ноутбуков, а не статический контент, который вы видите повсюду. — RJ 8 сен 2014, в 17:48
  • Только что добавил, чтобы никто не подумал, что результат всегда в одном и том же виде 🙂 — cfstras 8 сен 2014 в 18:16
  • 1
    +1 Я использую set -e в начале сценарий (таким образом, это решение не работает doxer.org/linux-shell-centos-debian-ostype). И другие решения специально не CentOS. Но я нашел эту ссылку, которая доказала этот ответ unix.stackexchange. com/a/92212 — gihanchanuka, 10 сен 2014, 13:51
  • 4
    не работает для Mac: cat:/etc/* release: нет такого файла или каталога — eridal 26 сен 2014, в 14:21
| показать 4 дополнительных комментария

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

  $ 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 = "VERSION_ID =" 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: это каталог  

6

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

  #!/bin/bashset -eYUM_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" Установка пакетов $ YUM_PACKAGE_NAME на CentOS "echo" ============  =================================== "yum install -y $ YUM_PACKAGE_NAME elif cat/etc/* release |  grep ^ NAME | grep Red; then echo "==========================================  ======= "echo" Установка пакетов $ YUM_PACKAGE_NAME на RedHat "echo" ===============================  ================ "yum install -y $ YUM_PACKAGE_NAME elif cat/etc/* release | grep ^ NAME | grep Fedora; then echo" =========  ======================================= "echo" Установка пакетов $ YUM_PACKAGE_NAME в Fedorea "echo  "================================================"  yum install -y $ YUM_PACKAGE_NAME elif cat/etc/* release | grep ^ NAME | grep Ubuntu; then echo "==========================  ===================== "echo" Установка пакетов $ DEB_PACKAGE_NAME в Ubuntu "echo" =================  ===============  =============== "apt-get update apt-get install -y $ DEB_PACKAGE_NAME elif cat/etc/* release |  grep ^ NAME |  grep Debian;  then echo "===============================================  "echo" Установка пакетов $ DEB_PACKAGE_NAME в Debian "echo" ======================================  ========= "apt-get update apt-get install -y $ DEB_PACKAGE_NAME elif cat/etc/* release |  grep ^ NAME |  grep Mint;  затем echo "===============================================" echo  "Установка пакетов $ DEB_PACKAGE_NAME на Mint" echo "========================================  ===== "apt-get update apt-get install -y $ DEB_PACKAGE_NAME elif cat/etc/* release |  grep ^ NAME |  grep Knoppix;  then echo "===============================================  == "echo" Установка пакетов $ DEB_PACKAGE_NAME на Kanoppix "echo" ====================================  ============= "apt-get update apt-get install -y $ DEB_PACKAGE_NAME else echo" ОС НЕ ОБНАРУЖЕНА, не удалось установить пакет $ PACKAGE "exit 1;  fiexit 0  

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

  delivery @ delivery-E5450 $ sudo sh detect_os.sh [sudo] пароль для доставки: NAME = "Ubuntu" ========================  ======================= Установка пакетов python2.7 python-dev python-pip libssl-dev на Ubuntu ===========  ==================================== Запустить http://dl.google.com стабильный InReleaseGet: 1  http://dl.google.com stable Release.gpg [916 B] Get: 2 http://dl.google.com стабильный выпуск [1.189 B] ...  

Улучшить этот ответ
ответ дан 20 янв.
добавить комментарий |

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

  #!/bin/bashset -  eYUM_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" Установка пакетов  $ YUM_PACKAGE_NAME на CentOS "echo" ===========================================  ==== "yum install -y $ YUM_PACKAGE_NAME elif cat/etc/* release | grep ^ NAME | grep Red; then echo" =====================  ========================== "echo" Установка пакетов $ YUM_PACKAGE_NAME на Red  Шляпа "эхо" ==============================================  = "yum install -y $ YUM_PACKAGE_NAME elif cat/etc/* release |  grep ^ NAME |  grep Fedora;  then echo "===============================================  = "echo" Установка пакетов $ YUM_PACKAGE_NAME в Fedorea "echo" =====================================  =========== "yum install -y $ YUM_PACKAGE_NAME elif cat/etc/* release |  grep ^ NAME |  grep Ubuntu;  then echo "===============================================  "echo" Установка пакетов $ DEB_PACKAGE_NAME в Ubuntu "echo" ======================================  ========= "apt-get update apt-get install -y $ DEB_PACKAGE_NAME elif cat/etc/* release |  grep ^ NAME |  grep Debian;  then echo "===============================================  "echo" Установка пакетов $ DEB_PACKAGE_NAME в Debian "echo" ======================================  ========= "apt-get update apt-get install -y $ DEB_PACKAGE_NAME elif cat/etc/* release |  grep ^ NAME |  grep Mint;  затем echo "===============================================" echo  "Установка пакетов $ DEB_PACKAGE_NAME на Mint" echo "========================================  ===== "apt-get update apt-get install -y $ DEB_PACKAGE_NAME elif cat/etc/* release |  grep ^ NAME |  grep Knoppix;  then echo "===============================================  == "echo" Установка пакетов $ DEB_PACKAGE_NAME на Kanoppix "echo" ====================================  ============= "apt-get update apt-get install -y $ DEB_PACKAGE_NAME else echo" ОС НЕ ОБНАРУЖЕНА, не удалось установить пакет $ PACKAGE "exit 1;  fiexit 0  

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

  delivery @ delivery-E5450 $ sudo sh detect_os. sh [sudo] пароль для доставки: NAME = "Ubuntu" =======================================  ========== Установка пакетов python2.7 python-dev python-pip libssl-dev в Ubuntu ==========================  ======================= Ign http://dl.google.com стабильный InReleaseGet: 1 http://dl.google.com стабильный Release.gpg  [916 B] Get: 2 http://dl.google.com стабильный выпуск [1.189 B] ...  

3

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

  DISTRO = $ (cat/etc/* - release  | grep -w NAME | cut -d = -f2 | tr -d '"') echo" Определенная платформа: $ DISTRO " 

Улучшите этот ответ
ответил 8 ноя 2018 в 10:04
  • В macOS я получаю cat:/etc/* - release: нет такого файла или каталога — csexton 8 ноября 2018 в 17:16
  • @csexton правда, я получаю то же самое: zsh: совпадений не найдено:/etc/* release — это будет работать только для систем linux, я полагаю … — Александр Некрасов 12 нояб., 13:57
  • Этот ответ наверняка работает только для Linux. Но другие ответы способны обнаруживать Linux только в отличие от других систем. Это базовое открытие совершенно не помогает обнаружить конкретный дистрибутив Linux, так же важно, как различать FreeBSD и Darwin. — Thomas Urban 20 дек. ’19 в 8:16
добавить комментарий |

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

  DISTRO = $ (cat/etc/* - отпустить  | grep -w NAME | cut -d = -f2 | tr -d '"') echo" Определенная платформа: $ DISTRO " 

3

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

  if ["$ {OSTYPE//[0-9.]/}" == "darwin"], то aminute_ago = "- v-1M" elif ["$ {OSTYPE//[0-9. ]/} "==" linux-gnu "], затем aminute_ago =" - d  "1 минуту назад " "fi  

Улучшите этот ответ
отредактировано 30 марта ’19 в 4:19
smileycreations15
38711 золотых знаков55 серебряных знаков2121 бронзовых знаков
ответил 27 февраля ’16 в 21:12
добавить комментарий |

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

  if ["$ {OSTYPE//[  0–9.]/} "==" дарвин "] затем aminute_ago =" - v-1M "elif [" $ {OSTYPE//[0-9.]/} "==" linux-gnu "] затем aminute_ago  = "- d " 1 минуту назад  "" fi  

2

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

  if [[-f (имя общего ресурса)/. Bash_alias _ $ (uname)]];  тогда .  (имя общего ресурса)/. bash_alias _ $ (uname) fi  

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

   alias ls = 'ls --color = auto'  

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

Улучшите этот ответ
ответил 15 янв. 36
добавить комментарий |

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

  if [[-f (имя общего ресурса)/. Bash_alias _ $ (uname)]];  тогда .  (имя общего ресурса)/. bash_alias _ $ (uname) fi  

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

   alias ls = 'ls --color = auto'  

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


2

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

  OS = $ (cat/etc/* release | grep ^ NAME | tr -d 'NAME = "') # $ echo $ OS # Ubuntu  

Улучшите этот ответ
отредактировано в марте 09 ’17 в 18:55
ответил 8 марта ’17 в 16:25
  • 2
    Хотя этот фрагмент кода приветствуется и может оказать некоторую помощь, его можно было бы значительно улучшить, если бы он включал объяснение как и почему это решает проблему. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает вопрос сейчас! Отредактируйте свой ответ, чтобы добавить пояснение и указать, какие ограничения и предположения применяются. — Тоби Спейт 08 марта ’17 в 18:04 iv>
  • 1
    Большинству людей кажется красивым и лаконичным linux, но, к сожалению, это приведет к ошибке в macOS. Возможно, это больше «обнаружение вкуса дистрибутива Linux из Bash» — csexton, 8 марта 2017 г., 19:08
  • 1
    @csexton OS = $ (([[-f/etc/* release]] && cat/etc/* release | grep ^ NAME | tr -d 'NAME = "') || echo" Unknown ") это будет работать без ошибок. — Kuzeko 01 окт. В 14:05
  • На самом деле это правильный способ OS = $ ($ (compgen -G "/etc/* release">/dev/null) && cat /etc/* release | grep ^ NAME | tr -d 'NAME = "') || $ (echo" $ {OSTYPE//[0-9.]/} ") — Кузеко 01 октября 2018 г. в 14:29
  • @ Кузеко У меня, к сожалению, все еще возникают ошибки при запуске этого на macOS. — csexton 01 октября 2018 г., 18:48
| show 2 дополнительных комментария

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

  OS = $ (cat/etc/* release | grep ^ NAME | tr -  d 'NAME = "') # $ echo $ OS # Ubuntu  

1

Это проверяет связку известных файлов на предмет идентификации, если дистрибутив 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"  

Улучшите этот ответ
отредактировано 02 октября 2018 в 19:24
ответил 02 октября 2018 в 19:12
добавить комментарий |

Это проверяет кучу известных файлов на предмет идентификации, если дистрибутив 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]]; затем sudo apt-get install  fi  

Улучшите этот ответ
ответил 21 августа 2013 в 01:53
  • 4
    А как насчет других систем Linux, которые не используют apt-get? — Уилф, 15 июня 2015, 10:14
  • ubuntu — это дистрибутив, а не класс операционной системы. — jitter 06 фев ’20 в 13:32
добавить комментарий |

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

  if [[  "$ OSTYPE" = ~ ^ linux]];  затем sudo apt-get install fi 


Как включить оболочку Linux Bash в Windows 10

Любители Linux радуются. Начиная с номера сборки 14328, Windows 10 позволяет запускать в окне особый вариант оболочки Bash (в Ubuntu). Используя Bash, вы можете перемещаться по файловой системе, устанавливать и запускать приложения командной строки Linux, такие как текстовый редактор vi, или, с помощью некоторых неофициальных настроек, пытаться загрузить оконные программы. Однако, прежде чем вы сможете использовать Bash в Windows 10, вам необходимо включить его. Вот как это сделать.

1. Перейдите в настройки. Вы можете попасть туда, щелкнув значок шестеренки в меню «Пуск».

2. Нажмите «Обновление и безопасность».

3. Выберите для разработчиков в левом столбце.

4. Выберите режим разработчика в разделе «Использовать функции разработчика», если он еще не включен.

5. Перейдите в Панель управления (старая панель управления Windows). Вы можете попасть туда, нажав Windows Key + X и выбрав Панель управления во всплывающем меню.

6. Выберите «Программы и компоненты». Если он не отображается, убедитесь, что вы выбрали «Крупные значки» в меню «Просмотр по».

7. Нажмите «Включение или отключение функций Windows».

8. Включите «Подсистема Windows для Linux» и нажмите ОК.

9. Нажмите кнопку «Перезагрузить сейчас».

источник>

10. Найдите Bash в окне поиска Cortana/и щелкните его значок.

11. Введите «y» и нажмите Enter , когда будет предложено установить Ubuntu. Затем системе потребуется несколько минут для установки Ubuntu в окне командной строки.

12. Создайте имя пользователя и пароль.

Теперь вы можете использовать оболочку Bash как если вы были на компьютере с установленной Ubuntu в качестве основной ОС. Есть несколько встроенных приложений командной строки, включая текстовые редакторы vi и pico, и вы можете добавить больше с помощью команды apt-get. Также есть программа, которая позволяет запускать оконные приложения Ubuntu в Windows 10.

Производительность и производительность Windows 10

  • Предыдущий совет
  • Следующий совет
  • Лучшие сочетания клавиш в Windows 10
  • Mrror your screen to the TV or Monitor
  • Ускорение загрузки Windows 10
  • Получите сверхбыструю мышь, скорость тачпада
  • Откалибруйте монитор
  • Активируйте ‘God Mode ‘
  • Дефрагментация жесткого диска
  • Измерьте время, необходимое для загрузки приложений при загрузке
  • Используйте максимальную мощность процессора
  • Включить смахивание для удаления в электронной почте
  • Копировать и вставить в командной строке
  • Как записать экран в Windows 10
  • Использование автономных карт
  • Получите полный макет сенсорной клавиатуры Windows 10
  • Создайте файл .Reg для облегчения взлома реестра
  • Запись игрового процесса на ПК в приложении Xbox
  • Выполните чистую установку Windows 10
  • Удалите Windows 10 и выполните откат до 7 или 8
  • E nable оболочка Linux Bash
  • Создание подробного отчета об уровне заряда батареи
  • Превратите ПК в беспроводной дисплей
  • Открытие папок на панели задач
  • Открытие сайтов на панели задач
  • Импорт контактов Gmail
  • Получение уведомлений Android
  • Использование нескольких рабочих столов
  • Использование управления глазами
  • Использование функции временной шкалы для возобновления задачи
  • Отправка веб-страниц с телефона на ПК
  • Все советы по Windows 10
  • Увеличьте время автономной работы
Оцените статью
logicle.ru
Добавить комментарий