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

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

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

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

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

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.

  • Как проверить, является ли данный путь файлом или каталогом
  • Китайские иероглифы, а не латинский, записываются в файл
  • -r имя_файла &&. имя файла
  • Как переместить кусочки данных между двумя словами, если у данных есть процентный символ в начале?
  • Некоторые символы исчезают после обработки текстового файла
  • помощь со сценарием; если статус - это то, что если не сделать что-то еще
  • Синтаксис Ошибка при попытке запустить скрипт
  • как создать скрипт для создания резервной копии gpg?
  • Есть ли способ иметь одну строку конкретного кода ksh внутри файла bash?
  • Ssh на несколько серверов и объединить файлы в один
  • Как ввести пароль для нескольких окон?
  • Interesting Posts

    Linux: номера основных и второстепенных устройств

    sed: замена новой строки на заданной строке (или последней строке)

    Переименование пакетного файла: лучше, чем случайный идентификатор, чтобы предотвратить удаление файлов с повторяющимися именами файлов?

    Установка разрешений на основе прав пользователя

    Стрелка вверх GDB не работает

    Получено SIGHUP или SIGTERM: nano не может редактировать пустой файл

    Как изменить привязки ключевых слов пейджера

    Как изменить все строки, состоящие из одного символа «0», на другое?

    Безопасное удаление файлов в файловой системе btrfs

    Как явным образом вызывать встроенную оболочку?

    Добавить строку суффикса в конец каждой строки?

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

    Команда xargs приводит к sed:;: Нет такого файла или каталога

    Не удается получить яркость клавиш Fn, работающих на ASUS N551VW

    скрипт bash, который автоматизирует загрузку и установку приложения

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