Какой самый переносимый из sed, awk, perl и sh?

15

Может кто-нибудь привести эти инструменты в порядок переносимости? Что из этого наверняка можно найти даже в самых минимальных * nix системах? Кто-нибудь из них на 100% обязательно присутствует? Я предполагаю, что порядок следующий:

  1. AWK
  2. СЭД
  3. ш
  4. Perl

Хотя я представляю, что есть системы, которые по умолчанию не используют оболочку Борна, какая-то оболочка будет присутствовать по умолчанию, будет ли она всегда /bin/sh? Предположительно нет, если это не оболочка борнового типа. Как awkи sedесть страницы , объясняющие их на спецификации POSIX , так предположительно , они всегда будут присутствовать. Это так? Могу ли я быть уверен, что оба будут установлены на любой * nix? Включая встроенные системы?

Тердон
источник
встроенные системы часто жертвуют переносимостью, чтобы оставаться минимальными. Многие из них не соответствуют POSIX.
Иордания
@jordanm это означает, что они, возможно, не имеют ничего из этого? Я предполагаю систему, которая обеспечивает по крайней мере минимальный интерфейс оболочки. Я знаю, что busybox предоставляет sh, awkи, sedнапример, и мой NAS на основе busybox также имеет Perl.
Terdon
1
Они могут быть у вас, но то, что они делают, зависит от системы, поэтому вопрос не имеет особого смысла, как указано.
Стефан Шазелас
@StephaneChazelas ах, не могли бы вы помочь мне сузить это тогда? Разве нельзя отсортировать их по вероятности их обнаружения в системе X? Мой опыт - строго Linux и пара встроенных систем NAS. Я знаю, что вы никогда не получите GNU / Linux без всех 4 из них, но разве вы не можете дать мне представление о том, какой из них безопаснее всего представить?
Тердон

Ответы:

15

Какой самый переносимый из sed, awk, perl и sh?

sed, shИ awkпортативны уточняются по стандарту POSIX, perlне так не поддерживается стандартом.

Может кто-нибудь привести эти инструменты в порядок переносимости?

Если вы придерживаетесь совместимого кода, не должно быть порядка переносимости для трех команд POSIX.

Что из этого наверняка можно найти даже в самых минимальных * nix системах?

Три POSIX, наряду со многими другими утилитами, являются обязательными для операционной системы POSIX. Операционные системы, в которых отсутствуют некоторые из них из-за минимизации или предоставления неполных / несоответствующих реализаций, все же существуют.

На самом деле, большинство (если не все) бесплатных и открытых Unix-подобных операционных систем, вероятно, не пройдут процесс соответствия, если они попытаются, и в любом случае никогда не попытаются.

Кто-нибудь из них на 100% обязательно присутствует?

Я был бы удивлен, обнаружив * nix-подобную ОС без оболочки на основе синтаксиса Bourne, но все возможно, особенно со встроенными системами.

Я предполагаю, что порядок следующий: какая-то оболочка будет присутствовать по умолчанию, она всегда будет в / bin / sh?

/bin/shскорее всего, это оболочка семейства синтаксиса Bourne, но не гарантируется совместимость с POSIX, даже в системах, совместимых с POSIX. Например, он установлен /usr/xpg4/bin/shна Solaris 10 и более ранних версиях, в то время /bin/shкак это устаревшая оболочка Bourne, отличная от POSIX.

jlliagre
источник
12

Обратите внимание на 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и многие другие.

Уоррен Янг
источник
Спасибо, но меня интересует порядок их переносимости. Если я правильно вас понял, вы предлагаете это shи sedявляются наиболее портативными. ОК, а кто из других? И shдействительно ли это портативный? Что если оболочка по умолчанию является производной C-оболочки? Будет ли у такой системы символическая ссылка /bin/sh?
Terdon
Спасибо за редактирование, что это вещь , хотя, как sedи awkобеспечиваются с помощью BusyBox, почему бы вы более удивлены найти sedотсутствующий? Есть ли у вас идеи, если альтернативы busybox также предоставляют sed и awk?
Тердон
Re: POSIX против Bourne shell , переписал совет придерживаться LCD из двух. Re: проверить цитаты , я неправильно запомнил причину этого, но нашел главу в руководстве Autoconf, где причина покрыта, и отредактировал ответ соответственно. Re: sed vs awk и Busybox , я объяснил, что: большая сложность и сортировка. sedделает меньше, поэтому его двоичный файл будет меньше, следовательно, есть меньше причин для его удаления, чем awk, что довольно сложно. (20 КБ против 48 КБ в моей системе.) Re: Альтернативы Busybox , я не знаю какой-либо другой альтернативы «одного окна».
Уоррен Янг
+1 Потому что я согласен с вашей общей посылкой здесь (что наименьший общий знаменатель будет своего рода sh- странным, что тердон занимает место awkи sedвыше этого o_O?), Хотя это только совпадает с целями Autotool, поскольку некоторые среды, особенно маленькие, не может быть предназначен для строительства, точка.
Златовласка
1
@WarrenYoung - вот о чем я думал. Я понятия не имел, будут ли на всех системах * nix по умолчанию установлена ​​оболочка bourne. Если у них у всех есть /bin/sh, то все по-другому, но я не знал, что у всех будет один. Извините за то, что не принял это, кстати, я разрывался между вашими и jlliagre ответами, оба из которых ответили на мой вопрос. Я выбрал его, потому что он обратился к нему более прямо и потому, что у него меньше представителей :).
Terdon