Обратите внимание на Autotools: придерживайтесь наименьшего общего знаменателя оболочки Bourne и POSIX - возможно, дополненного sed
- если вам нужно написать что-то, что должно работать везде . Могут существовать системы, в которых что-то ломается, но вы можете обойти такие проблемы, переписав.
Например, некоторые древние системы имеют проблемы с ошибками расширения в test
, иначе [
:
if [ $foo = bar ] ; then...
поэтому практика Autoconf заключается в том, чтобы переписать его в двойных кавычках с односимвольным префиксом, например так:
if [ x"$foo" = "xbar" ] ; then...
Вы также можете использовать "x$foo"
здесь. Это защищает от возможности того, что это $foo
может быть допустимым параметром test(1)
, и поскольку [
является псевдонимом для test
, оно может неправильно интерпретировать выражение. Решение состоит в том, чтобы создать ситуацию, с которой [
всегда начинается неизвестный аргумент x
, что означает, что он не может иметь особого значения [
.
(Autoconf также рекомендует использовать test
вместо [
, но этот совет возникает как реакция на возможные конфликты с M4 , который также использует [
в своем синтаксисе.)
awk - это POSIX , поэтому теоретически он доступен везде. Это даже в Busybox , так что у вас будет awk
реализация даже в некоторых очень ограниченных встроенных системах Linux. Тем не менее, я был бы менее удивлен встретить систему без awk
чем sed
. Я полагаю, все сводится к сложности: более простые инструменты с большей вероятностью выдержат агрессивную сортировку.
Perl не является частью какого-либо широко распространенного стандарта, POSIX или другого, поэтому вы просто не можете рассчитывать на него, если ничего не знаете заранее о целевой среде. Perl не установлен по умолчанию в:
- Cygwin
- FreeBSD и NetBSD
- «минимальная» установка для некоторых Linux, включая Slackware
- многие встроенные Linux, которые полагаются в первую очередь на Busybox для своей пользовательской среды
В руководстве Autoconf есть глава по программированию переносимых оболочек, которая должна быть вам полезна. В последнем разделе охватывает такие инструменты , как sed
, awk
и многие другие.