POSIX Awk w systemie Solaris 11?

13

Jest to mniej więcej pytanie uzupełniające do następujących dwóch:

Widzę, że w systemie Solaris 10 (SunOS 5.10) otrzymuję następujące wyniki:

$ type -a awk
awk is /usr/bin/awk
$ PATH="$(getconf PATH)" type -a awk
awk is /usr/xpg4/bin/awk
awk is /usr/bin/awk
$

W /usr/bin/awksystemie Solaris 10 nie akceptuje standardowej składni awk POSIX, takiej jak '!x[$0]++', ale akceptuje /usr/xpg4/bin/awk. Jak dotąd wystarczająco dobry.

Jednak w Solaris 11 jest /usr/bin/awknawet z getconf PATH. Chociaż istnieje nawki oawkjest /usr/bin, najwyraźniej nie są wskazywane przez dowiązania symboliczne z dowolnego miejsca.

To, że Solaris ma certyfikat POSIX, zaskoczyło mnie.

Jak mogę uzyskać Awk zgodny ze standardem POSIX w systemie Solaris 11 przy użyciu przenośnego kodu, który będzie działał również w innych systemach zgodnych z POSIX? (Albo jest jedyną opcją, aby sprawdzić istnienie nawkalbo oawki użyć jednego z nich, jeśli obecny?)

Co do tego, czym nawk i oawk?

Dzika karta
źródło
/usr/xpg4/bin/awknie ma w Solaris 11? nawkjest „nowy awk”, ulepszony AT&T awk.
Kusalananda
@ StéphaneChazelas AFAIK, tylko pełne instalacje systemu operacyjnego są testowane i deklarowane jako zgodne, jeśli są zgodne.
jlliagre 21.04.17
@jlliagre, nie może to być pełny system operacyjny (systemy operacyjne z zainstalowanymi wszystkimi opcjonalnymi pakietami), ponieważ nie byłoby to praktyczne (istnieją również pakiety wzajemnie się wykluczające) i należałoby zdefiniować zakres „pakietu opcjonalnego”.
Stéphane Chazelas
@ StéphaneChazelas Tak. Podczas gdy Solaris 10 miał koncepcję całej dystrybucji i skutecznie instalował wszystkie pakiety (poza niewybranymi ustawieniami regionalnymi), nie ma to już miejsca w przypadku Solaris 11. Moje przypuszczenie, że grupa „solaris-large-server” jest używana do zgodności z POSIX testy.
jlliagre 21.04.17

Odpowiedzi:

19

W przypadku pełnej lub stacjonarnej instalacji Solaris 11 dostępne są trzy awk implementacje plus niektóre warianty:

    / usr / bin / awk pkg: /system/[email protected]
    / usr / bin / nawk           pkg: /system/[email protected]
    / usr / bin / oawk           pkg: /system/[email protected]

    / usr / gnu / bin / awk pkg: /text/[email protected]
    / usr / bin / gawk           pkg: /text/[email protected]
    / usr / bin / igawk pkg: /text/[email protected]
    / usr / bin / pgawk pkg: /text/[email protected]

    / usr / xpg4 / bin / awk       pkg: /system/xopen/[email protected]

Wszystkie są „zgodne ze standardami”, choć są zgodne z różnymi standardami.

  • /usr/bin/awkjest zgodny ze starszą awkimplementacją UNIX wydaną w 1977 r. Jest przechowywany jako pierwszy w domyślnym systemie PATH, aby nie łamać istniejących skryptów, ponieważ kolejne awkwydania przerywają kompatybilność. oawkjest synonimemawk

  • /usr/bin/nawkjest „nową” wersją awk, po raz pierwszy dostarczoną w SVR3.1 w 1986 roku. AwkStandard POSIX został oparty na tej implementacji. /usr/xpg4/bin/awkjest prawie identyczny z pierwszym, ale ten jest formalnie sprawdzany pod kątem testów sprawdzania zgodności z POSIX.

  • /usr/gnu/bin/awk, /usr/bin/gawkjest również wariant GNU awk. Ma na celu zachowanie zgodności z większością lub wszystkimi standardami POSIX, gdy zmienna środowiskowa POSIXLY_CORRECTjest ustawiona w środowisku lub gdy jest wywoływana z -W posixopcją, ale poza tym dodaje wiele specyficznych własnych rozszerzeń. igawki pgawksame są rozszerzeniami gawk, pierwszy obsługuje pliki, a drugi obsługuje profilowanie.

Zobacz także rozdział historii GNU,awk aby uzyskać wiele przydatnych informacji.

core-osGwarantowane jest, że tylko pakiety będą obecne podczas regularnej instalacji Solaris 11, więc tylko oawk/awki nawktam są. W szczególności, gdy tworzysz nową strefę nieglobalną , domyślnie zawiera ona solaris-small-serverpakiet grupowy, więc xpg4ani gnu awkbinaria, ani binaria nie są dostępne. To jest z założenia. solaris-small-serverGrupa jest minimalny punkt startowy, do którego dodać wymagane pakiety dla aplikacji, aby działać poprawnie. Jest to bardziej bezpieczne i wydajne niż poprzedni (Solaris 10) sposób, w którym wszystko zainstalowane w strefie globalnej było również instalowane w strefie innej niż globalna, więc trzeba było usunąć nieużywane pakiety, aby zminimalizować strefę.

Aby uzyskać awkwsparcie dla POSIX w sposób przenośny w takiej instalacji „małego serwera”, musisz zainstalować xcu4pakiet i ustawić ŚCIEŻKĘ na zgodną z POSIX:

pkg install xcu4
PATH=$(getconf PATH):$PATH

Czy należy z jakiegoś powodu nie chcesz, aby zainstalować ten pakiet, obejście tego problemu jest użycie „Custom” PATH, zawierający nawkjako awk, na przykład:

mkdir -p /opt/posix/bin
cp /usr/bin/nawk /opt/posix/bin/awk
PATH=/opt/posix/bin:$PATH

Alternatywnie możesz zainstalować GNU awki ustawić, PATHaby najpierw:

pkg install gawk
PATH=/usr/gnu/bin:$PATH

Pamiętaj, że nie dotyczy to Solaris 11. Podobna grupa pakietów istniała już w systemie Solaris 10 i wcześniejszych, a narzędzia zgodne z POSIX zostały zainstalowane tylko w metaklasach „Użytkownik końcowy”, „Deweloper” i „Pełna instalacja”. Zainstalowanie systemu lub strefy z metaklastrem „Core” lub „Networking support” doprowadziłoby do tego samego xpg4brakującego problemu.

Należy również zauważyć, że brak /usr/xpg4/bin/awkw systemie Solaris 11 nie oznacza błędu zgodności z POSIX. Tylko pełne instalacje Solaris są używane w zdecydowanej większości testów przeprowadzanych przez Oracle i niezależnych dostawców oprogramowania, w tym program certyfikacji Open Group . Zredukowane instalacje są obsługiwane, ale nie kwalifikują się .

Jeśli rozpowszechniasz skrypty powłoki (lub aplikacje osadzające skrypty powłoki / wywołujące polecenia powłoki) dla Solaris 11, wystarczy zdefiniować /system/xopen/xcu4zależność w pakiecie IPS , a instalator automatycznie zrobi to, co jest wymagane do poprawnego działania skryptu:

depend fmri=pkg:/system/xopen/xcu4 type=require

Zobacz https://docs.oracle.com/cd/E53394_01/html/E54820/dependtypes.html

jlliagre
źródło
3
Brak awk zgodnego z POSIX jest błędem zgodności z POSIX. System, który nie ma awk zgodnego z POSIX, nie może uruchamiać skryptów zgodnych z POSIX. Te małe serwery solarne nie są POSIX-em, a tym bardziej systemami uniksowymi. I przypuszczam, że nie są objęte certyfikatem Solaris uzyskanym od Open Group.
Stéphane Chazelas
1
@ StéphaneChazelas Tak, te systemy nie są kwalifikowane, więc oczywiście nie są objęte gwarancją. To samo miałoby miejsce, jeśli Solaris zostanie zainstalowany na niekwalifikowanym sprzęcie. Zgodność z POSIX / Unix nie jest warunkiem prawidłowego działania systemu Solaris. Sam Solaris nie korzysta z narzędzi POSIX, gdy różnią się one od własnych.
jlliagre 21.04.17
@ StéphaneChazelas W każdym razie POSIX awkjest zawsze obecny w systemie Solaris lub strefie nieglobalnej, więc problem nie dotyczy dostępności, ale ogranicza się do nazwy polecenia ( nawkvs awk). docs.oracle.com/cd/E53394_01/html/E54763/nawk-1.html
jlliagre
1
nawkjest prawie POSIX ( CONVFMTna przykład nie obsługuje ), ale tak, przynajmniej nie jest tak źle, jak grep( na przykład nie ma POSIX -e/ -E) lub tr(nie ma tr a-f A-F).
Stéphane Chazelas,
@ StéphaneChazelas Rzeczywiście, do mojej odpowiedzi dodano wyjaśnienie. Dzięki.
jlliagre