Який найбільш портативний з sed, awk, perl та sh?


15

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

  1. awk
  2. sed
  3. ш
  4. перл

Хоча я собі уявляю, що існують системи, які не мають за замовчуванням оболонки bourne, якась оболонка буде присутньою за замовчуванням, чи завжди це буде /bin/sh? Імовірно, ні, якщо це не оболонка типу бурна. На обох awkі sedє сторінки, що пояснюють їх специфікацією POSIX, тому, імовірно, вони завжди будуть присутніми. Невже це так? Чи можу я бути впевнений, що обидва будуть встановлені на будь-якому * nix? У тому числі вбудовані системи?


вбудовані системи часто жертвують портативністю, щоб залишатися мінімальною. Багато з них не сумісні з POSIX.
Йорданм

@jordanm це означає, що вони, можливо, не мають жодного з них? Я припускаю систему, яка забезпечує принаймні мінімальний інтерфейс оболонки. Я знаю, що зайнятий сервіс забезпечує sh, awkі, sedнаприклад, у мене в NASbox також є перл.
terdon

1
Ви можете мати їх, але те, що вони роблять, буде залежати від систем, тому питання не має особливого сенсу, як зазначено.
Стефан Шазелас

@StephaneChazelas ах, ви можете мені допомогти звузити це? Чи не можливо їх сортувати за тим, наскільки вірогідними вони можуть бути знайдені в системі X? Мій досвід - це суто Linux та пара вбудованих систем NAS. Я знаю, що ви ніколи не отримаєте GNU / Linux без усіх цих 4, але ви не можете дати мені уявити, який з них найбезпечніше вважати присутнім?
terdon

Відповіді:


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.


12

Візьміть підказку від 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і багато інших.


Дякую, але мені цікаво про порядок переносимості цих даних. Якщо я вас правильно прочитав, ви пропонуєте це shі sedє найбільш портативним. Гаразд, що з інших? І чи shсправді це портативний? Що робити, якщо оболонка за замовчуванням є похідною C-оболонки? Чи буде така система все ще мати симпосилання на /bin/sh?
terdon

Дякую за редагування, що це річ , хоча, як sedі awkзабезпечуються з допомогою BusyBox, чому б ви більш здивовані знайти sedвідсутній? Чи маєте ви ідею, чи альтернативи зайнятих ящиків також забезпечують sed і awk?
тердон

Re: POSIX проти оболонки Борна , переписав пораду дотримуватися РК двох. Re: тестування цитування , я неправильно перерахував причину цього, але знайшов розділ у посібнику з Autoconf, де висвітлено причину, і відповідним чином відредагував відповідь. Re: sed vs awk і Busybox , я пояснив це: більша складність і триадальність. sedробить менше, тому його двійковий файл буде меншим, отже, є менше причин для його видалення, ніж awkдосить складний. (20 кБ проти 48 кб у моїй системі.) Re: Альтернативи Busybox , я не знаю жодної іншої альтернативи " єдиного вікна" .
Воррен Янг

+1 Тому що я згоден з вашим загальним припущенням (що найнижчий загальний знаменник буде якимось sh- дивним, що тердон займає ранги awkі sedвище цього o_O?), Хоча це лише збігається з цілями Autotool, оскільки деякі середовища, особливо невеликі, може не бути призначеним для будівництва, періоду.
goldilocks

1
@WarrenYoung - це те, про що я цікавився. Я не маю поняття, чи всі * nix системи насправді мають стандартну оболонку bourne. Якщо у них все є /bin/sh, то все по-іншому, але я не знав, що все буде мати. Вибачте за те, що не прийняли це до речі, мене розірвали між вашими та jlliagre відповідями, обидві відповіли на моє запитання. Я вибрав його, тому що він вирішив це безпосередньо і тому, що у нього менше представників :).
terdon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.