Który jest najbardziej przenośny spośród sed, awk, perl i sh?

15

Czy ktoś może ustawić te narzędzia w kolejności przenośności? Która z nich jest pewne, można znaleźć na nawet najbardziej minimalne systemów uniksowych? Czy któryś z nich jest w 100% na pewno obecny? Domyślam się, że kolejność jest następująca:

  1. awk
  2. sed
  3. sh
  4. perl

Chociaż wyobrażam sobie, że istnieją systemy, które nie domyślnie używają powłoki Bourne'a, niektóre powłoki będą obecne jako domyślne, czy to zawsze będzie /bin/sh? Prawdopodobnie nie, jeśli nie jest to skorupa typu Bourne'a. Zarówno awki sedmają strony wyjaśniając je w specyfikacji POSIX tak prawdopodobnie zawsze będą obecne. Czy tak jest Czy mogę mieć pewność, że oba zostaną zainstalowane na dowolnym * nix? W tym systemy wbudowane?

terdon
źródło
systemy wbudowane często poświęcają przenośność, aby pozostać minimalnym. Wiele z nich nie jest zgodnych z POSIX.
Jordan
@jordanm czy to oznacza, że ​​prawdopodobnie nie mają żadnego z nich? Zakładam, że system zapewnia przynajmniej minimalny interfejs powłoki. Wiem, że busybox zapewnia sh, awki sedna przykład i mój NAS oparty na busyboksie ma również perla.
terdon
1
Możesz je mieć, ale to, co robią, będzie się różnić w zależności od systemu, więc pytanie nie ma większego sensu, jak zostało powiedziane.
Stéphane Chazelas
@StephaneChazelas ah, czy mógłbyś mi pomóc to zawęzić? Czy nie jest możliwe posortowanie ich pod względem prawdopodobieństwa ich znalezienia w systemie X? Moje doświadczenie to ściśle Linux i kilka wbudowanych systemów NAS. Wiem, że nigdy nie dostaniesz GNU / Linuksa bez wszystkich 4, ale czy nie możesz mi powiedzieć, który z nich najbezpieczniej jest założyć?
terdon

Odpowiedzi:

15

Który jest najbardziej przenośny spośród sed, awk, perl i sh?

sed, shI awksą przenośne jest określony przez POSIX, perlnie jest jako nie poparta standardzie.

Czy ktoś może ustawić te narzędzia w kolejności przenośności?

Jeśli będziesz trzymać się zgodnego kodu, nie powinno być kolejności przenoszenia trzech poleceń POSIX.

Który z nich z pewnością znajdzie się w nawet najmniejszych systemach * nix?

Trzy POSIX wraz z wieloma innymi narzędziami są obowiązkowe, aby system operacyjny był POSIX. Istnieją jednak systemy operacyjne pozbawione niektórych z powodu minimalizacji lub zapewniające niepełne / niezgodne implementacje.

W rzeczywistości większość (jeśli nie wszystkie) wolne i otwarte systemy operacyjne typu Unix prawdopodobnie nie przeszłyby procesu zgodności, gdyby próbowały i nigdy nie próbują.

Czy któryś z nich jest w 100% na pewno obecny?

Byłbym zaskoczony, gdybym znalazł system operacyjny taki jak * nix bez powłoki opartej na składni Bourne'a, ale wszystko jest możliwe, szczególnie w systemach wbudowanych.

Domyślam się, że kolejność jest następująca: Jakaś powłoka będzie domyślnie obecna, czy zawsze będzie w / bin / sh?

/bin/shprawdopodobnie jest powłoką rodziny składni Bourne'a, ale nie ma gwarancji zgodności z POSIX, nawet w systemach zgodnych z POSIX. Na przykład jest /usr/xpg4/bin/shon w /bin/shsystemie Solaris 10 i starszych, podczas gdy jest starszą oryginalną powłoką Bourne'a, która nie jest POSIX.

jlliagre
źródło
12

Weź przykład z Autotools: trzymaj się najniższego wspólnego mianownika powłoki Bourne'a i POSIX - być może powiększonego sed- jeśli musisz napisać coś, co musi działać wszędzie . Mogą istnieć systemy, w których coś się psuje, ale można obejść takie problemy, przepisując.

Na przykład niektóre starożytne systemy mają problemy z błędami ekspansji test, czyli [:

 if [ $foo = bar ] ; then...

więc praktyka Autoconf polega na przepisywaniu go w podwójnych cudzysłowach z prefiksem jednoznakowym, na przykład:

 if [ x"$foo" = "xbar" ] ; then...

Możesz również użyć "x$foo"tutaj. Chroni to przed możliwością, która $foomoże być prawidłową opcją test(1), a ponieważ [jest to alias test, może źle interpretować wyrażenie. Rozwiązaniem jest ustawienie sytuacji, w której nieznany argument [zawsze zaczyna się od x, co oznacza, że ​​nie może mieć specjalnego znaczenia [.

(Autoconf zaleca również używanie testzamiast [, ale ta rada pojawia się jako reakcja na możliwe konflikty z M4 , który również używa [swojej składni).

awk jest POSIX , więc teoretycznie jest dostępny wszędzie. Jest nawet w Busybox , więc będziesz miał awkimplementację nawet w niektórych bardzo restrykcyjnych wbudowanych systemach Linux. Mimo to, że będę mniej zaskoczony, aby natknąć się na systemie bez awkniż sed. Podejrzewam, że sprowadza się to do złożoności: prostsze narzędzia mają większe szanse na przetrwanie agresywnego triage.

Perl nie jest częścią żadnego rozpowszechnionego standardu, POSIX lub innego, więc po prostu nie możesz na niego liczyć, jeśli nie wiesz nic o środowisku docelowym. Perl nie jest domyślnie instalowany w:

  • Cygwin
  • FreeBSD i NetBSD
  • „minimalna” instalacja dla niektórych Linuksów, w tym Slackware
  • wiele osadzonych Linuksów, które w swojej przestrzeni użytkownika polegają głównie na Busybox

Podręcznik Autoconf zawiera rozdział dotyczący programowania przenośnych powłok, który powinien być dla ciebie pomocny. Narzędzia pokrowce Ostatnia sekcja podoba sed, awki wiele innych.

Warren Young
źródło
Dzięki, ale zastanawiam się nad kolejnością przenoszenia tych. Jeśli dobrze cię przeczytałem, sugerujesz to shi sedjesteś najbardziej przenośny. OK, a co z pozostałymi? I czy shnaprawdę jest tak przenośny? Co jeśli domyślna powłoka jest pochodną powłoki C? Czy taki system nadal będzie zawierał dowiązanie symboliczne /bin/sh?
terdon
Dzięki za edycji, to jest rzeczą, jak sedi awkdostarczonych przez Busybox, dlaczego chcesz być bardziej zaskoczony, aby znaleźć sednieobecny? Czy masz pomysł, czy alternatywne opcje dla busybox zapewniają także sed i awk?
terdon
Re: POSIX vs powłoka Bourne'a , przepisałem radę, by trzymać się wyświetlacza LCD tych dwóch. Re: cytat testowy , źle zapamiętałem przyczynę, ale znalazłem rozdział w podręczniku Autoconf, w którym podano przyczynę, i odpowiednio zredagowałem odpowiedź. Re: sed vs awk i Busybox , wyjaśniłem, że: większa złożoność i segregacja. sedrobi mniej, więc jego plik binarny będzie mniejszy, dlatego jest mniej powodów, aby go usunąć niż awk, co jest dość złożone. (20 kiB w porównaniu do 48 kiB w moim systemie.) Re: Alternatywy Busybox , nie znam żadnej innej alternatywy dla zakupów w jednym miejscu.
Warren Young,
+1 Ponieważ zgadzam się z twoją ogólną przesłanką tutaj (że najniższym wspólnym mianownikiem będzie jakiś rodzaj sh- dziwny, że terdon ranguje awki sedpowyżej tego o_O?), Chociaż jest to tylko zbieżne z celami Autotool, ponieważ niektóre środowiska, szczególnie małe, może nie być przeznaczony do zabudowy, kropka.
goldilocks,
1
@WarrenYoung zastanawiałem się nad tym. Nie miałem (nie miałem) pojęcia, czy wszystkie systemy * nix miałyby domyślnie zainstalowaną powłokę Bourne'a. Jeśli wszystkie mają /bin/sh, to wszystko jest inne, ale nie wiedziałem, że wszyscy będą mieli. Przepraszam, że nie przyjąłem tego, byłem rozdarty między twoimi a odpowiedziami Jlliagre, które odpowiedziały na moje pytanie. Wybrałem jego, ponieważ to dotyczyło go bardziej bezpośrednio i ponieważ ma mniej przedstawicieli :).
terdon