Какие ресурсы существуют для программирования переносимых оболочек? Окончательный ответ - тестирование на всех целевых платформах, но это редко бывает практичным.
Спецификация POSIX / Single UNIX - это только начало, но она не говорит вам ни об уровне поддержки каждой реализации, ни о том, какие существуют общие расширения. Вы можете прочитать документацию по каждой реализации, но это очень много времени и не совсем точно.
Мне кажется, что идеальным форматом была бы некая аннотированная версия спецификации POSIX, где каждая функция аннотирована уровнем поддержки среди различных реализаций. Что-то подобное существует? Или есть другие полезные ресурсы?
Например, есть страницы переносимости оболочек Свена Машика , но речь идет только о синтаксических элементах и нескольких встроенных модулях, и охватывает только старые оболочки. Я ищу более полный ресурс.
источник
autoconf
иMetaconfig
(Perl,rn
) и собрать все приемы и их пояснительные комментарии в одном месте.Ответы:
В руководстве по autoconf есть раздел, посвященный программированию переносимых оболочек .
Хотя это и не предназначено специально для POSIX, это, вероятно, наиболее полный набор того, что нужно и чего не следует делать при попытке написать переносимый код оболочки.
источник
В дополнение к
dash
иposh
, естьbournesh
(илиbsh
), Оболочка Борна из семейной реликвии , которую можно использовать для обнаружения Bashisms .Проект «Семейная реликвия» также включает в себя «Инструмент семейной реликвии», набор из более чем 100 стандартных утилит Unix (которые могут служить отправной точкой для сравнения параметров командной строки).
источник
Аналогично этому ответу , попробуйте выполнить ваш скрипт в шикарном стиле .
Кроме того, не забудьте установить для
POSIXLY_CORRECT
переменной среды значение true, поскольку это заставляет многие программы (не только оболочку) более строго придерживаться стандартов POSIX.источник
Написание ваших сценариев с использованием тире может быть началом.
источник
find
еще не реализовано-exec +
).find
делает в-exec utility {} +
настоящее время.Чтобы немного расширить, вы можете попробовать
checkbashisms
вdevscripts
пакете Debian / Ubuntu .Он не идеален, но имеет преимущество в том, что является существующей отправной точкой. Например, он не видит классических глюков с
sed
/find
относительно GNU против BSD / других отличий.По умолчанию он ориентирован на Debian + dash,
-p
флаг может быть полезен в вашем случае.источник
Сегодня в системе обычно можно найти оболочку POSIX, и это, как правило, означает, что вы можете создавать сценарии на языке POSIX (по модулю, сталкивающемуся с ошибками соответствия).
Единственная проблема заключается в том, что
/bin/sh
иногда это не оболочка POSIX. И вы должны жестко закодировать#!
строку в сценарии, которые должны вести себя как хорошие исполняемые файлы; Вы не можете просто попросить пользователя исследовать проблему и затем вызвать свой скрипт как/path/to/posix/shell myscript
.Итак, хитрость заключается в том, чтобы использовать функции POSIX в вашем скрипте, но заставить скрипт автоматически находить оболочку POSIX. Один из способов сделать это так:
Есть и другие подходы, такие как генерация кода. Ускорьте ваши сценарии с помощью небольшого сценария, который принимает текстовые файлы без символа #! линия, и добавляет один.
Худшее, что вы можете сделать, это начать писать целые сценарии таким образом, чтобы они запускались на оболочке Bourne с 1981 года. Это необходимо, только если вы должны писать для системы, у которой на самом деле нет другой оболочки ,
источник