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

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

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

  • Как избежать метасимволов оболочки с помощью команды `find`?
  • Вывод команды «history» после повторного подключения через SSH
  • linux периодический скрипт проверки системы или утилита
  • Почему этот скрипт рыбы не запускается из пусковой установки?
  • Создайте ссылку, но не измените канонический путь
  • Создание туннеля openvpn в сценарии bash
  • Есть ли какая-либо оболочка, которая реализует только POSIX и POSIX, таким образом, чтобы она выдавала ошибку для любой несовместимой функции?

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

  • Перенесите stderr и stdout в / dev / null с помощью / bin / sh
  • SSH Agent-Forwarding работает, но как насчет sudo -u username no shell / permissions? композитор
  • Почему мое условие всегда ложно?
  • Функция проверки переменной BASH
  • Как обеспечить, чтобы эхо в файл было очищено?
  • Как я могу сортировать список с уровнем major.minor.patch и иногда rc правильно?
  • 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 - лучшая ОС в мире.