Візьміть підказку від Autotools: дотримуйтесь найменшого загального знаменника оболонки Bourne та POSIX - можливо, доповненого sed- якщо вам потрібно написати щось, що повинно працювати скрізь . Можуть існувати системи, де щось ламається, але ви можете подолати такі проблеми, переписавши.
Наприклад, деякі старовинні системи мають проблеми з помилками розширення в testaka [:
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і багато інших.