К сожалению, это единственные опции, доступные Вам под/proc/sys/net/ipv6/conf:
http://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/proc-sys-net-ipv6..html
Почему существует так много 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:
dash
, , как известно, принят Debian и Ubuntu в 2006 году в качестве реализации по умолчанию / bin / sh
. (Bash остается интерактивной командной оболочкой по умолчанию в производных от Debian.)
Команда 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 и «другие».
Эта диаграмма может помочь:
(Нажмите, чтобы Версия SVG, 31 КБ, или просмотреть полноразмерную версию PNG , 218 КБ.)
Что значит быть «несовместимым с sh»?
Кто-то говорит о sh
несовместимость обычно означает одно из трех:
Они относятся к одной из этих «других» оболочек ».
Они проводят различие между семействами Bourne и C.
Они говорят о некоторой специфической особенности одной оболочки семейства Борнов, которой нет во всех других оболочках семейства Борнов. 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 . Вы можете распознать некоторые проблемные конструкции, о которых говорится в ваших сценариях.
Почему они разные?
По тем же причинам все «Новые и Улучшенные!» все по-другому:
Улучшенная версия может быть улучшена только путем нарушения обратной совместимости.
Кто-то придумал другой способ работы, который им больше нравится, но который отличается от старого.
Кто-то попытался заново реализовать старый стандарт, не понимая его полностью, поэтому они ошиблись и создали непреднамеренное различие.
Сноски и отступления :
Ранние версии 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 - появятся только в начале следующего года.
Оболочка Томпсона была довольно примитивной по сегодняшним меркам. Это была всего лишь интерактивная командная оболочка, а не среду программирования сценариев, которую мы ожидаем сегодня. В ней были такие вещи, как конвейеры и перенаправление ввода-вывода, которые мы считаем прототипной частью «оболочки Unix», так что мы думаем о командной оболочке MS-DOS как получение их из Unix.
Оболочка Bourne также заменила оболочку PWB , которая добавила важные вещи в оболочку Томпсона, такие как возможность программирования ( if
, переключатель
и , в то время как
) и ранняя форма переменных среды. Оболочка PWB еще менее известна, чем оболочка Томпсона. черт возьми, потому что он не входил во все версии Unix.
Когда кто-то не конкретно говорит о совместимости POSIX и Bourne shell, он может иметь в виду целый ряд вещей.
С одной стороны, они могли использовать оболочку Борна 1979 года в качестве основы. « sh
-совместимый сценарий» в этом смысле означает, что он должен безупречно работать на истинной оболочке Bourne или на любых ее преемниках и клонах: ash
, bash
, ksh
, zsh
и т. Д.
Кто-то на другом полюсе вместо этого принимает оболочку, указанную в POSIX, в качестве базовой. В наши дни мы воспринимаем так много функций оболочки POSIX как «стандартные», что часто забываем, что на самом деле они не присутствовали в оболочке Bourne: встроенная арифметика, управление заданиями, история команд, псевдонимы, редактирование командной строки, $ ()
форма подстановки команд и т. Д.
Хотя корни оболочки 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
сегодня редко встретишь.
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.
GNU Bash во многом выходит за рамки POSIX, но вы можете попросить его запустить в более чистом режиме POSIX .
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, но они не сделают этого в ближайшее время по философским причинам . Его легко переключить , если это вас беспокоит.
В наши дни редко можно найти систему с истинно ванильной оболочкой Борна как / 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 | подробнее
об истинной оболочке Борна.
Иногда вы сталкиваетесь с приверженцами fish
, scsh
или rc / es
, но они даже реже, чем поклонники C shell.
Семейство оболочек rc
обычно не используется в системах Unix / Linux, но это семейство исторически важно, поэтому оно и заняло место на диаграмме выше. rc
- это стандартная оболочка операционной системы Plan 9 от Bell Labs , своего рода преемник 10-го издания Unix ,создан в рамках продолжающихся исследований Bell Labs в области проектирования операционных систем. На уровне программирования он несовместим как с Bourne, так и с оболочкой C; там, наверное, урок.
Наиболее активным вариантом rc
является вариант, поддерживаемый Тоби Гудвином , который основан на клоне Unix rc
Байрона Ракитциса.
«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
и придерживаются основного командного языка оболочки.