Учитывая, что POSIX является наиболее близкой к общему стандарту среди всех единиц, мне интересно знать, существует ли оболочка, которая поддерживает его исключительно. Хотя большинство современных оболочек обеспечивают поддержку POSIX (и без проблем запускают POSIX-совместимые сценарии), они не очень хорошо указывают на несовместимые функции.
Существует ли какая-либо оболочка, которая реализует только POSIX и POSIX таким образом, что она выдаст ошибку для любой несовместимой функции?
РЕДАКТИРОВАТЬ Я хочу уточнить, что я не прошу общих советов по написанию сценариев переносимой оболочки. Соответствующий вопрос, упомянутый в комментариях, уже охватывал это. Я подумал об этом вопросе, когда узнал, что у bash
него есть --posix
возможность, но я обнаружил, что он влияет только на некоторые варианты инициализации, что не совсем то, что я ищу.
источник
dash
. Я упомянул переносимость как общий контекст для моего вопроса, но это не было его истинным намерением.Ответы:
К сожалению, для переносимых сценариев требование 'portable' обычно более строго, чем 'POSIX-совместимое'. То есть написать что-то, что работает в любой оболочке POSIX, не так уж сложно, но заставить его работать в любой реальной оболочке сложнее.
Вы можете начать с установки каждой оболочки в вашем менеджере пакетов, в частности,
posh
звуки Debian выглядят так, как вы хотите (Ordinary SHell, совместимый с политикой). Политика Debian - это POSIX с несколькими исключениями (echo -n
указано,local
...).Помимо этого, тестирование должно охватывать несколько оболочек (особенно / bin / sh) на ряде платформ. Я тестирую на Solaris (/ bin / sh и xpg4 / sh) и BSD. AIX и HP-UX очень совместимы и не вызывают проблем. bash - это маленький собственный мир.
Я бы порекомендовал руководство Autoconf по переносимой оболочке , которая абсолютно великолепна и экономит много времени. Большие куски этого устарели, но это нормально; просто пропустите TruUnix, Ultrix и так далее, если вам все равно!
источник
posh
действительно звучит как то, что я прошу. Я сделаю несколько тестов, как только смогу.Вы можете использовать ShellCheck (GitHub) как линтер для своих скриптов оболочки. Также есть онлайн-версия .
Чтобы обнаружить проблемы совместимости POSIX (например, SC2039 ), строка shebang вашего сценария оболочки должна быть такой
#!/bin/sh
. Вы также можете перейти--shell=sh
кshellcheck
.Пример (
test.sh
):Результат (
shellcheck test.sh
):источник
Bash будет работать в POSIX-совместимом режиме, если установлена
POSIXLY_CORRECT
переменная окружения. Из справочной страницы:Многие другие утилиты GNU также
POSIXLY_CORRECT
заслуживают уважения , поэтому, если вы работаете в системе с преимущественно инструментами GNU (например, в большинстве систем Linux), это хорошее начало, если ваша цель - соответствие POSIX.источник
[[
.