Что означает быть “sh совместим”?

К сожалению, это единственные опции, доступные Вам под/proc/sys/net/ipv6/conf:

http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/proc-sys-net-ipv6..html

63
23.05.2017, 14:33
2 ответа

Почему существует так много sh-совместимых оболочек?

Оболочка Bourne была впервые публично выпущена в 1979 году как часть Unix V7 . Поскольку практически каждая Unix и Unix-подобная система происходит от V7 Unix - даже если только духовно - оболочка Bourne была с нами «навсегда».

Оболочка Bourne фактически заменила более раннюю оболочку, переименовал оболочку Томпсона , но это произошло так рано в истории Unix, что сегодня о ней почти забыли. Оболочка Борна является расширенным набором оболочки Томпсона

Оболочки Борна и Томпсона назывались sh . Оболочка , указанная в POSIX , также называется sh . Итак, когда кто-то говорит, что sh -совместим, они, махая рукой, ссылаются на эту серию оболочек. Если бы они хотели быть конкретными, они бы сказали «оболочка POSIX» или «оболочка Bourne». ³

Оболочка POSIX основана на версии 1988 года KornShell , которая, в свою очередь, должна была заменить оболочка Bourne на AT&T Unix, обогнав оболочку BSD C с точки зрения функций. В той степени, в которой ksh является предком оболочки POSIX, большинство Unix и Unix-подобных систем включают сегодня какой-то вариант оболочки Korn. Исключение составляют крошечные встроенные системы, которые не могут позволить себе место, которое занимает полная оболочка POSIX.

Тем не менее, оболочка Korn - как вещь, отличная от оболочки POSIX - никогда не становилась популярной за пределами коммерческого мира Unix. Это связано с тем, что его рост совпал с ранними годами коммерциализации Unix, поэтому он был вовлечен в войну Unix . BSD Unix отказались от нее в пользу оболочки C, и ее исходный код не был доступен для использования в Linux, когда она только начиналась. Итак, когда первые дистрибьюторы Linux начали искать командную оболочку для своего ядра Linux, они обычно выбирали GNU Bash , одну из тех sh -совместимых, о которых вы говорите ».

Эта ранняя связь между Linux и Bash в значительной степени решила судьбу многих других оболочек. , включая ksh , csh и tcsh . Некоторые стойкие до сих пор используют эти оболочки, но их очень меньшинство ».

Вся эта история объясняет, почему создатели относительно поздно появившихся, таких как bash , zsh ], а yash решил сделать их совместимыми с sh : совместимость с Bourne / POSIX - это минимум, который оболочка для Unix-подобных систем должна обеспечить, чтобы получить широкое распространение.

Во многих системах интерактивная командная оболочка по умолчанию и / bin / sh - разные вещи. / bin / sh может быть:

  • Исходная оболочка Борна. Это распространено в старых системах UNIX®, таких как Solaris 10 (выпущенный в 2005 г.) и его предшественники.

  • Оболочка, сертифицированная для POSIX. Это обычное дело в новых системах UNIX®, таких как Solaris 11 (2010).

  • Оболочка Альмквиста . Это клон оболочки Bourne / POSIX с открытым исходным кодом , первоначально выпущенный в Usenet в 1989 году , который затем был внесен в CSRG Беркли для включения в первый выпуск BSD, не содержащий исходного кода AT&T, 4.4BSD-Lite . Оболочку Almquist часто называют ash , даже если она установлена ​​как / bin / sh .

    4.4BSD-Lite, в свою очередь, стала базой для всех современных производных BSD, при этом / bin / sh осталась производной от Альмквиста в большинстве из них, за одним важным исключением, указанным ниже. Вы можете увидеть это прямое происхождение в репозиториях исходного кода для NetBSD и FreeBSD : они поставляли производную оболочку Альмквиста с первого дня.

    Есть два важных пепла. разветвляется за пределами мира BSD:

    1. dash , , как известно, принят Debian и Ubuntu в 2006 году в качестве реализации по умолчанию / bin / sh . (Bash остается интерактивной командной оболочкой по умолчанию в производных от Debian.)

    2. Команда ash в BusyBox , которая часто используется во встроенных Linux. и может использоваться для реализации / bin / sh . Поскольку он размещает тире и был получен из старого пакета Debian ash , я решил считать его производным от тире . чем ash , несмотря на его имя команды в BusyBox.

      (BusyBox также включает менее функциональную альтернативу ash под названием hush . Обычно только один из двух будет встроен в любой заданный двоичный файл BusyBox: ash по умолчанию, но hush , когда места действительно мало. Таким образом, / bin / sh в системах на основе BusyBox не всегда похож на тире .)

  • GNU Bash ,который отключает большинство своих расширений, не относящихся к POSIX, при вызове как sh .

    Этот выбор типичен для настольных и серверных версий Linux, за исключением Debian и его производных. Mac OS X также сделала это с момента выпуска Panther в 2003 году.

  • Оболочка с ksh93 расширениями POSIX , как в OpenBSD . Хотя оболочка OpenBSD меняет поведение, чтобы избежать синтаксической и семантической несовместимости с оболочками Bourne и POSIX при вызове как sh , она не отключает никаких чистых расширений, которые не конфликтуют со старыми оболочками.

    Это не обычное явление; вам не следует ожидать возможности ksh93 в / bin / sh .

Выше я использовал «сценарий оболочки» как общий термин, означающий сценарии оболочки Bourne / POSIX. Это связано с повсеместным распространением оболочек семейства Борнов. Чтобы говорить о сценариях в других оболочках, вам нужно указать квалификатор, например «сценарий оболочки C». Даже в системах, где оболочка семейства C является интерактивной оболочкой по умолчанию, лучше использовать оболочку Bourne для написания сценариев.

Показательно, что когда Википедия классифицирует оболочки Unix , они группируют их в совместимые с оболочкой Bourne, совместимые с оболочкой C и «другие».

Эта диаграмма может помочь:

The Unix Shells: Bourne, Korn, POSIX, C, and rc Shell Families

(Нажмите, чтобы Версия SVG, 31 КБ, или просмотреть полноразмерную версию PNG , 218 КБ.)

Что значит быть «несовместимым с sh»?

Кто-то говорит о sh несовместимость обычно означает одно из трех:

  1. Они относятся к одной из этих «других» оболочек ».

  2. Они проводят различие между семействами Bourne и C.

  3. Они говорят о некоторой специфической особенности одной оболочки семейства Борнов, которой нет во всех других оболочках семейства Борнов. ksh93 , bash и zsh , в частности, имеют много функций, которых нет в старых «стандартных» оболочках. Эти три также во многих отношениях несовместимы, если вы выйдете за пределы общей базы POSIX / ksh88 .

Классическая ошибка - писать сценарий оболочки со строкой #! / Bin / sh shebang вверху, но использовать внутри расширения оболочки Bash или Korn. Поскольку / bin / sh является одной из оболочек на приведенной выше диаграмме семейства Korn / POSIX во многих системах в наши дни, такие сценарии будут работать в системе, в которой они написаны, но затем откажутся в системах, где / bin / sh - это что-то из более широкого семейства снарядов Bourne. Лучше всего использовать строки shebang #! / Bin / bash или #! / Bin / ksh , если сценарий использует такие расширения.

Есть много способов проверить, является ли данный сценарий оболочки семейства Bourne переносимым:

  • Запустите на нем checkbashisms , инструмент из проекта Debian, который проверяет сценарий на наличие " bashisms . "

  • Запустите его под posh , оболочкой в ​​репозитории пакетов Debian, которая намеренно реализует только функции, указанные в SUS3 , плюс несколько других второстепенных функций .

  • Запустите его под osh из проекта Schily Tools , улучшенной версии оболочки Bourne с открытым исходным кодом, созданной Sun как часть OpenSolaris в 2005 году, что делает ее одной из самых простых способы получить оболочку Борна в стиле 1979 года на современном компьютере.

    Дистрибутив Schily Tools также включает bosh , оболочку типа POSIX с множеством нестандартных функций , но которая может быть полезна для тестирования совместимости сценариев оболочки, предназначенных для работы на всех POSIX. семейные ракушки. Он имеет тенденцию быть более консервативным по своему набору функций, чем bash , zsh и расширенные версии ksh93 .

    Schily Tools также включает оболочку под названием bsh , но это историческая странность , которая вовсе не является оболочкой семейства Борнов.

  • Прочтите главу Portable Shell Programming в руководстве GNU Autoconf . Вы можете распознать некоторые проблемные конструкции, о которых говорится в ваших сценариях.

Почему они разные?

По тем же причинам все «Новые и Улучшенные!» все по-другому:

  • Улучшенная версия может быть улучшена только путем нарушения обратной совместимости.

  • Кто-то придумал другой способ работы, который им больше нравится, но который отличается от старого.

  • Кто-то попытался заново реализовать старый стандарт, не понимая его полностью, поэтому они ошиблись и создали непреднамеренное различие.


Сноски и отступления :

  1. Ранние версии BSD Unix были просто коллекциями дополнительного программного обеспечения для V6 Unix. Поскольку оболочка Bourne не добавлялась в AT&T Unix до V7, технически BSD не начинала с оболочки Bourne. Ответом BSD на примитивную природу оболочки Томпсона была оболочка C .

    Тем не менее, первые автономные версии BSD (2.9BSD и 3BSD) были основаны на V7 или его портативном преемнике UNIX / 32V , поэтому они включали оболочку Bourne.

    (Линия 2BSD превратилась в параллельную ветвь BSD для миникомпьютеров Digital PDP , в то время как линии 3BSD и 4BSD продолжили использовать преимущества новых типов компьютеров, таких как Vaxen и Рабочие станции Unix . 2.9BSD, по сути, была PDP-версией 4.1cBSD; они были современными и совместно используемыми кодами . PDP не исчезли просто так, когда появился VAX, поэтому линия 2BSD - это все еще валяется вместе с .)

    Можно с уверенностью сказать, что к 1983 году оболочка Bourne была повсюду в мире Unix. Это хорошее приближение к «вечности» в компьютерной индустрии. В этом году MS-DOS получила иерархическую файловую систему (оууу, как здорово!) И первый 24-битный Macintosh с его 9-дюймовым черно-белым экраном - не в оттенках серого, а буквально черным и white - появятся только в начале следующего года.

  2. Оболочка Томпсона была довольно примитивной по сегодняшним меркам. Это была всего лишь интерактивная командная оболочка, а не среду программирования сценариев, которую мы ожидаем сегодня. В ней были такие вещи, как конвейеры и перенаправление ввода-вывода, которые мы считаем прототипной частью «оболочки Unix», так что мы думаем о командной оболочке MS-DOS как получение их из Unix.

    Оболочка Bourne также заменила оболочку PWB , которая добавила важные вещи в оболочку Томпсона, такие как возможность программирования ( if , переключатель и , в то время как ) и ранняя форма переменных среды. Оболочка PWB еще менее известна, чем оболочка Томпсона. черт возьми, потому что он не входил во все версии Unix.

  3. Когда кто-то не конкретно говорит о совместимости POSIX и Bourne shell, он может иметь в виду целый ряд вещей.

    С одной стороны, они могли использовать оболочку Борна 1979 года в качестве основы. « sh -совместимый сценарий» в этом смысле означает, что он должен безупречно работать на истинной оболочке Bourne или на любых ее преемниках и клонах: ash , bash , ksh , zsh и т. Д.

    Кто-то на другом полюсе вместо этого принимает оболочку, указанную в POSIX, в качестве базовой. В наши дни мы воспринимаем так много функций оболочки POSIX как «стандартные», что часто забываем, что на самом деле они не присутствовали в оболочке Bourne: встроенная арифметика, управление заданиями, история команд, псевдонимы, редактирование командной строки, $ () форма подстановки команд и т. Д.

  4. Хотя корни оболочки Korn уходят в начало 1980-х, AT&T не поставляла ее в Unix до System V Release 4 в 1988 году. Поскольку так много коммерческих Unix-систем основано на SVR4, это поместило ksh практически во все соответствующие коммерческие Unix-системы с конца 1980-х годов.

    (Несколько странных разновидностей Unix, основанных на SVR3 и ранее удерживавшихся на рынке после выпуска SVR4, но они были первыми против стены , когда пришла революция .)

    1988 год также был годом выхода первого стандарта POSIX с его оболочкой Korn, основанной на «оболочке POSIX». Позже, в 1993 году, вышла улучшенная версия оболочки Korn. Поскольку POSIX фактически прибил оригинал к месту, ksh разделился на две основные версии: ksh88 и ksh93 , названные в честь лет, связанных с их расколом.

    ksh88 не полностью совместим с POSIX, хотя различия невелики, поэтому некоторые версии оболочки ksh88 были исправлены для обеспечения совместимости с POSIX. (Это из интересного интервью на Slashdot с доктором Дэвидом Г. Корном . Да, парень, который написал оболочку.)

    ksh93 полностью совместимый надмножество Оболочка POSIX . Разработка ksh93 была спорадической с тех пор, как репозиторий первичных источников был перемещен с AT&T на GitHub , причем самой последней версии было около 3 лет, когда я пишу это, ksh93v. (Базовое название проекта остается ksh93 с добавленными суффиксами для обозначения версий выпуска после 1993 года.)

    Системы, которые включают оболочку Korn отдельно от оболочки POSIX, обычно делают ее доступной как / bin / ksh , хотя иногда он прячется в другом месте.

    Когда мы говорим о ksh или оболочке Korn по имени, мы говорим о функциях ksh93 , которые отличают ее от обратно совместимых подмножеств оболочки Bourne и POSIX. Чистый ksh88 сегодня редко встретишь.

  5. AT&T держала исходный код оболочки Korn закрытым до марта 2000 года .К тому моменту связь Linux с GNU Bash была очень сильной. Каждый из Bash и ksh93 имеет преимущества перед другим , но в этот момент инерция сохраняет тесную связь Linux с Bash.

    Что касается того, почему первые поставщики Linux чаще всего выбирают GNU Bash вместо pdksh , который был доступен в то время, когда Linux только начинал, я предполагаю, что это потому, что так много остальная часть пользовательского пространства также пришла из проекта GNU . Bash также несколько более продвинутый, чем pdksh , поскольку разработчики Bash не ограничиваются копированием функций оболочки Korn.

    Работа над pdksh остановилась примерно в то время, когда AT&T выпустила исходный код истинной оболочки Korn. Однако есть два основных форка, которые все еще поддерживаются: OpenBSD pdksh и MirBSD Korn Shell, mksh .

    Мне интересно, что mksh - единственная реализация оболочки Korn, которая в настоящее время упакована для Cygwin.

  6. GNU Bash во многом выходит за рамки POSIX, но вы можете попросить его запустить в более чистом режиме POSIX .

  7. csh / tcsh обычно была интерактивной оболочкой по умолчанию в BSD Unix до начала 1990-х годов.

    Будучи вариантом BSD , ранние версии Mac OS X были такими, через Mac OS X 10.2 «Jaguar» . OS X переключила оболочку по умолчанию с tcsh на Bash в OS X 10.3 "Panther" . Это изменение не повлияло на системы, обновленные с 10.2 или более ранней версии. Существующие пользователи этих преобразованных систем сохранили свою оболочку tcsh .

    FreeBSD утверждает, что по-прежнему использует tcsh в качестве оболочки по умолчанию , но на виртуальной машине FreeBSD 10, которая у меня здесь, оболочка по умолчанию является одной из POSIX-совместимых ] Варианты оболочки Альмквиста . Это верно и для NetBSD.

    OpenBSD вместо этого использует форк pdksh в качестве оболочки по умолчанию.

    Более высокая популярность Linux и OS X заставляет некоторых людей желать, чтобы FreeBSD также перешла на Bash, но они не сделают этого в ближайшее время по философским причинам . Его легко переключить , если это вас беспокоит.

  8. В наши дни редко можно найти систему с истинно ванильной оболочкой Борна как / bin / sh . Вы должны изо всех сил найти что-то достаточно близкое к нему для тестирования совместимости.

    Мне известен только один способ запустить настоящую оболочку Bourne, выпущенную в 1979 году, на современном компьютере: использовать образы дисков Ancient Unix V7 с симулятором SIMH PDP-11 из Проект моделирования компьютерной истории . SIMH работает на практически на всех современных компьютерах , а не только на Unix-подобных. SIMH даже работает на Android и на iOS .

    В OpenSolaris , Sun впервые открыла исходный код версии SVR4 оболочки Bourne. До этого исходный код для версий оболочки Bourne после V7 был доступен только тем, у кого была лицензия на исходный код Unix.

    Этот код теперь доступен отдельно от остальной части несуществующего проекта OpenSolaris из нескольких разных источников.

    Самым прямым источником является проект оболочки Heirloom Bourne . Это стало доступно вскоре после выхода оригинальной версии OpenSolaris 2005 года. В течение следующих нескольких месяцев была проделана некоторая работа по переносимости и исправлению ошибок, но затем разработка проекта остановилась.

    Йорг Шиллинг лучше справился с поддержкой версии этого кода как osh в своем пакете Schily Tools . Подробнее об этом см. Выше.

    Имейте в виду, что эти оболочки, производные от выпуска исходного кода 2005 г., содержат поддержку многобайтового набора символов , управление заданиями, функции оболочки и другие функции, отсутствующие в исходной версии. Оболочка Борна 1979 г.

    Один из способов узнать, используете ли вы исходную оболочку Борна, - это проверить, поддерживает ли она недокументированную функцию, добавленную для облегчения перехода из оболочки Томпсона: ^ в качестве псевдонима для | . Другими словами, такая команда, как ls ^ more , выдаст ошибку в оболочке типа Korn или POSIX, но будет вести себя как ls | подробнее об истинной оболочке Борна.

  9. Иногда вы сталкиваетесь с приверженцами fish , scsh или rc / es , но они даже реже, чем поклонники C shell.

    Семейство оболочек rc обычно не используется в системах Unix / Linux, но это семейство исторически важно, поэтому оно и заняло место на диаграмме выше. rc - это стандартная оболочка операционной системы Plan 9 от Bell Labs , своего рода преемник 10-го издания Unix ,создан в рамках продолжающихся исследований Bell Labs в области проектирования операционных систем. На уровне программирования он несовместим как с Bourne, так и с оболочкой C; там, наверное, урок.

    Наиболее активным вариантом rc является вариант, поддерживаемый Тоби Гудвином , который основан на клоне Unix rc Байрона Ракитциса.

116
27.01.2020, 19:32

«sh совместимый» относится к POSIX sh , базовой оболочке, которая требуется для всех совместимых систем. Sh-совместимый сценарий должен работать на любой POSIX-совместимой машине.

Причина, по которой это необходимо сказать, заключается в том, что обычно / bin / sh является символической ссылкой на / bin / bash , которая позволяет некоторым башизмам проникать в сценарии, которые объявляют себя используйте sh с #! / bin / sh . Эти сценарии не работают в системах, которые не используют bash как / bin / sh , включая некоторые коммерческие Unix навсегда, и Debian и производные недавно.

В частности, в последнее время наблюдается тенденция к использованию тире , Debian Almquish Shell по умолчанию sh , потому что он меньше и должен быть быстрее. Эта тенденция высветила множество тех башизмов, которые были в предполагаемых sh скриптах. Описание чего-либо как «sh совместимого» означает, что он явно предназначен для работы с этими системами, оставаясь полностью в рамках языка, указанного в POSIX - все оболочки будут реализовывать расширенный набор этой функциональности, поэтому он гарантированно будет работать везде, но их расширения несовместимы друг с другом.

Различные оболочки имеют свою собственную историю разработки и со временем разошлись в разных направлениях, поскольку они добавляли функции, помогающие пользователям в интерактивном использовании, или расширения сценариев, такие как ассоциативные массивы. «Sh-несовместимый» сценарий будет использовать некоторые из этих нестандартных функций расширения, например условные выражения Bash [.

Не-POSIX функции в bash и tcsh и zsh и во всех других текущих оболочках полезны , и там много случаев, когда они могут вам понадобиться. Их просто не следует использовать в сценарии, который объявляет себя работающим с / bin / sh , потому что вы не можете полагаться на эти функции в базовой реализации sh на система, в которой вы работаете.

Сценарий, который действительно должен использовать, скажем, ассоциативные массивы, должен гарантировать, что он запускается с bash , а не с sh :

#!/bin/bash
declare -A array

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

25
27.01.2020, 19:32

Теги

Похожие вопросы