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

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

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

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

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

  • разбивать файл на несколько частей
  • Рекурсивно удалять файлы с idx> 10000
  • Назначение выбора текста переменной в сценарии bash
  • Параметры командной строки с аргументом в сценарии оболочки
  • Как выбрать самый старый файл в папке из каталога
  • wait bash-builtin сжигает CPU на 100 процентов
  • Мониторинг файла журнала и выполнение различных команд в зависимости от разных условий
  • Как запустить скрипт на tty вместо запроса входа в systemd?
  • 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.

    Interesting Posts

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

    Диск показывает неправильный размер на DF, правильный размер в gparted и vmware

    «Недопустимая магия магии» на OpenWRT

    Почему некоторые приложения используют ~ / .config / appname для своих конфигурационных данных, а другие используют ~ / .appname?

    Изменение конфигурационных файлов с помощью awk / sed

    Как я могу добавить четыре пробела перед каждой строкой кода программы в терминале

    Как настроить браузер по умолчанию?

    Я хочу создать задание cron, которое запускает команду в удаленном поле Linux, используя ssh, но я хочу, чтобы ssh отвечал на пароль

    Рабочее пространство резервного копирования без локальных копий удаленных репозиториев git

    Разместить одиночную точку с Vim / Ex

    Запустите сценарий оболочки перед запуском

    эвристически найти, как различный набор файлов

    Добавить аргументы для последнего вызова `find … -exec $ COMMAND {} +`

    Как добавить сетевой принтер, требующий аутентификации?

    не удается выполнить вход из моего приложения через rsyslogd в контейнере linux

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