Как я могу проверить соответствие POSIX для сценариев оболочки?

Вероятно, главное, что этот сайт научил меня до сих пор, – это важность написания переносимых сценариев оболочки.

Учитывая, что POSIX является самым близким к общему стандарту между всеми модулями, мне интересно знать, есть ли оболочка, которая поддерживает его исключительно. В то время как большинство современных оболочек обеспечивают поддержку POSIX (и без проблем запускают POSIX-совместимые скрипты), они не делают хорошую работу, указывая на несовместимые функции.

Есть ли какая-либо оболочка, которая реализует только POSIX и POSIX, таким образом, чтобы она выдавала ошибку для любой несовместимой функции?

EDIT Я хочу уточнить, что я не прошу общих советов для написания переносимых сценариев оболочки. Связанный с этим вопрос, упомянутый в комментариях, уже охватывал это. Я подумал об этом вопросе, когда узнал, что у bash есть опция --posix но только для того, чтобы обнаружить, что это влияет только на поведение в стиле intialization, которое не совсем то, что я ищу.

  • Как получить все номера из строки и добавить их?
  • Bash, как запустить некоторые фоновые процессы, но ждать других?
  • Экспорт переменных и установка глобальных переменных в Bash
  • Как разработать несколько выбранных файлов путем перетаскивания в сценарий bash
  • Есть ли заклинание командной строки для сохранения определенных столбцов по имени в CSV-файле?
  • Как найти ответственный сценарий с результатами поиска?
  • Удалить конкретный столбец, если он существует в файле CSV
  • Могу ли я изменить способ отображения параметров выбора?
  • 3 Solutions collect form web for “Как я могу проверить соответствие POSIX для сценариев оболочки?”

    К сожалению, «портативный» обычно является более сильным требованием, чем «совместимый с POSIX» для сценариев оболочки. То есть, писать что-то, что работает на любой оболочке POSIX, не слишком сложно, но заставить его работать на любой реальной оболочке сложнее.

    Вы можете начать с установки каждой оболочки в вашем диспетчере пакетов, в частности, posh звуки debian, такие как то, что вы хотите (совместимый с политикой обычный Шелл). Политика Debian – это POSIX за несколькими исключениями ( echo -n указано, local …).

    Помимо этого, тестирование должно охватывать несколько оболочек (особенно в / bin / sh) на различных платформах. Я тестирую Solaris (/ bin / sh и xpg4 / sh) и BSD. AIX и HP-UX очень совместимы и не вызывают проблем. Баш – это маленький мир.

    Я бы рекомендовал руководство Autoconf для портативной оболочки , что является абсолютно блестящим и экономит много времени. Большие куски его устарели, но это нормально; просто пропустите TruUnix и Ultrix и так далее, если вам все равно!

    Вы можете использовать ShellCheck (GitHub) как linter для ваших сценариев оболочки. Существует также онлайн-версия .

    Чтобы обнаружить проблемы совместимости с POSIX (например, SC2039 ), строка shebang вашего сценария оболочки должна быть #!/bin/sh . Вы также можете передать --shell=sh в shellcheck .

    Пример ( test.sh ):

     #!/bin/sh if [[ $HOSTNAME == test ]]; then echo fail &> foo fi 

    Результат ( shellcheck test.sh ):

     In test.sh line 2: if [[ $HOSTNAME == test ]]; then ^-- SC2039: In POSIX sh, [[ ]] is undefined. ^-- SC2039: In POSIX sh, HOSTNAME is undefined. In test.sh line 3: echo fail &> foo ^-- SC2039: In POSIX sh, &> is undefined. 

    Bash будет работать в режиме POSIX, если установлена ​​переменная среды POSIXLY_CORRECT . С manpage:

      POSIXLY_CORRECT If this variable is in the environment when bash starts, the shell enters posix mode before reading the startup files, as if the --posix invocation option had been supplied. If it is set while the shell is running, bash enables posix mode, as if the command set -o posix had been executed. 

    Многие другие утилиты GNU также будут соблюдать POSIXLY_CORRECT , поэтому, если вы используете систему с преимущественно инструментами GNU (например, большинство систем Linux), это хороший старт, если ваша цель – соответствие POSIX.

    Linux и Unix - лучшая ОС в мире.