@anchor{Portable Shell}
Есть определенные техники программирования скриптов командного
процессора, которых вам следует избегать, чтобы ваш код был переносим.
Bourne shell и совместимые с ним процессора, такие как Bash и Korn,
развивались в течении многих лет, но для того, чтобы избежать
трудностей, не используйте возможностей, которые были добавлены после
выпуска UNIX версии 7, примерно в 1977 году. Вы не должны использовать
функции командного процессора, псевдонимы (aliases), отрицательные классы
символов и другие возможности, которые присутствуют не во всех версиях
командных процессоров, совместимых с процессором Bourne; ограничьте себя
общим знаменателем. Даже unset не поддерживается всеми командными
процессорами! При указании интерпретатора ставьте пробел после символов
`#!', например,
#! /usr/bin/perl
Если вы уберете пробел перед путевым именем, то системы типа 4.2BSD, такие как Sequent DYNIX, будут просто игнорировать эту строку, поскольку они интерпретируют `#! /' как 4-х байтовое магическое число.
Набор внешних программ, которые можно запускать из скрипта
configure, довольно мал. See section `Utilities in Makefiles' in GNU Coding Standards,
ниже приведен список этих программ.
Это ограничение позволяет пользователям начать с небольшого количества
программ, постепенно компилируя остальные, и избежать слишком большого
числа зависимостей между пакетами.
Многие такие внешние утилиты обладают общим подмножеством переносимых
возможностей;
например, не полагайтесь на то, что команда ln имеет ключ
`-f', а cat вообще имеет какие-либо ключи. Скрипты sed не
должны содержать комментариев или использовать метки длиннее 8
символов. Не используйте `grep -s' для запрещения вывода, поскольку
`grep -s' на System V не запрещает вывод, а запрещает только
сообщения об ошибках. Вместо этого ключа лучше перенаправьте стандартные
потоки вывода и сообщений об ошибках (сообщения о несуществующих файлах)
программы grep на устройство `/dev/null'. Проверяйте код
возврата grep, чтобы узнать, произошло ли совпадение.
Go to the first, previous, next, last section, table of contents.