Візьміть підказку від Autotools: дотримуйтесь найменшого загального знаменника оболонки Bourne та POSIX - можливо, доповненого sed
- якщо вам потрібно написати щось, що повинно працювати скрізь . Можуть існувати системи, де щось ламається, але ви можете подолати такі проблеми, переписавши.
Наприклад, деякі старовинні системи мають проблеми з помилками розширення в test
aka [
:
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 не встановлено за замовчуванням у:
- Сігвін
- FreeBSD та NetBSD
- "мінімальні" встановлення для деяких Linuxes, включаючи Slackware
- багато вбудованих Linux, які в основному покладаються на Busybox для своєї країни користування
У посібнику Autoconf є розділ про програмування портативних оболонок, який повинен бути корисним для вас. В останньому розділі охоплює такі інструменти , як sed
, awk
і багато інших.