Возьмем вопрос: если у вас есть
/bin/sh
ссылка на bash, то bash не будет вести себя так же, когда/bin/sh
вызывается так же, как при вызове as/bin/bash
. Когда он вызывается какsh
, он ограничивается в основном POSIX-совместимостью и ограниченным набором расширений.
Означает ли это, что всякий раз, когда я сталкиваюсь со сценарием оболочки в Linux с символом sh: « #!/bin/sh
даже если в этом дистрибутиве bin/sh
есть символическая ссылка на другую оболочку, такую как dash или bash, она должна быть на 100% совместима с оболочкой bourne, поскольку ограничить себя ограниченным набором расширений? Чтобы я мог выполнить их во FreeBSD? Есть ли исключения из этого? Или я должен с уверенностью предположить, что это будет работать?
Так что, если в дистрибутиве bin/sh
есть символьная ссылка bin/bash
и сценарий использования #!/bin/sh
и сценарий содержат bashism, он не будет работать, так как bash будет находиться в режиме sh?
источник
/bin/sh
именем shebang. Сценарий оболочки все еще может явно использовать/bin/bash
. В любом случае, большинство сценариев оболочки, вероятно, будут нормально работать в / bin / sh, но проблема заключается в пользовательских инструментах, например, большинство сценариев оболочки ожидают пользовательского пространства GNU, что, вероятно, будет большей проблемой, чем просто некоторая синтаксическая ошибка. Я также добавил ссылку на ссылку на bash, в которой перечислено различное поведение в режиме posixКажется, есть некоторая путаница вокруг оболочки Борна. Оболочка Bourne была оболочкой Unix десятилетия назад, во времена до POSIX. В настоящее время «sh» является реализацией или другой оболочкой, которая реализует спецификацию POSIX, среди которых есть bash, pdksh, AT & T ksh, более новые оболочки Almquist и их производные, которые стали совместимыми с POSIX (включая «sh» некоторых BSD остальные BSD основаны на pdksh и Debian ash (dash)). Даже у Zsh есть режим, в котором он в основном соответствует POSIX.
Оболочка Bourne не совместима с POSIX и в настоящее время не встречается во многих системах. Где оболочка Bourne найдена или где ее нет, всегда будет "sh", который соответствует POSIX (и не будет оболочкой Bourne), обычно в
/bin
то время как заметным (раздражающим) исключением является Solaris.Обратите внимание, что до появления оболочки Борна, о которой мы говорим более 30 лет назад, «sh» была оболочкой Томпсона. Мы больше не пишем сценарии, совместимые с оболочкой Томпсона. Точно так же мы должны перестать думать о «ш» как о оболочке Борна.
Теперь «sh» - это спецификация, а не много когда-нибудь несовместимых вариантов реализации. Это значительно облегчает написание переносимых скриптов. Просто следуйте спецификации .
Это касается "sh" и всех стандартных утилит (sed, cut, tr ...)
источник
sed -r
. В системах с утилитами на основе BSD вы используетеsed -E
. Sed FreeBSD принимает оба, но Mac OS X принимает только-E
. И так далее, и так далее.\(...\)\1
имеет перевода в стандартных ERE).\|
поддерживает BRE. Я за то, чтобы писать как можно более мобильно. Я только делал (я думал, что это высоко ценится) наблюдение, что это может быть болезненным, и иногда запись в POSIX просто невозможна. Где-то есть ссылки, которые показывают много таких извращений; буду искать их.${VAR:=stuff...here}
но многие оболочки не позволяют вам, вы должны заключать в кавычкиstuff...here
.