POSIX Awk unter Solaris 11?

13

Dies ist mehr oder weniger eine Folgefrage zu den beiden folgenden:

Unter Solaris 10 (SunOS 5.10) werden die folgenden Ergebnisse angezeigt:

$ 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
$

/usr/bin/awkAkzeptiert unter Solaris 10 keine POSIX-Standard-Awk-Syntax wie '!x[$0]++', aber /usr/xpg4/bin/awk. Soweit gut genug.

Unter Solaris 11 gibt es jedoch nur /usr/bin/awkgerade mit getconf PATH. Obwohl es dies auch gibt nawkund oawkgibt /usr/bin, wird von Symlinks an keiner Stelle darauf hingewiesen.

Das Wissen, dass Solaris POSIX-zertifiziert ist, hat mich überrascht.

Wie kann ich ein POSIX-kompatibles Awk unter Solaris 11 mit portablem Code erhalten, der auch auf anderen POSIX-kompatiblen Systemen funktioniert? (Oder ist die einzige Option, um zu überprüfen, ob eine dieser vorhanden ist, nawkoder oawkeine davon zu verwenden, falls vorhanden?)

Was ist nawk und oawk?

Platzhalter
quelle
/usr/xpg4/bin/awkist nicht in Solaris 11? nawk"Neu ist awk", verbessert ein Unternehmen von AT & T awk.
Kusalananda
2
Sehen Sie mail-archive.com/[email protected]/msg00885.html
Stéphane Chazelas
@ StéphaneChazelas AFAIK, nur vollständige Betriebssysteminstallationen werden getestet und bei Einhaltung für konform erklärt.
Juli
@jlliagre, es können keine vollständigen Betriebssysteme sein (Betriebssysteme mit allen installierten optionalen Paketen), da dies nicht praktikabel wäre (es gibt auch Pakete, die sich gegenseitig ausschließen) und der Umfang des "optionalen Pakets" definiert werden müsste.
Stéphane Chazelas
@ StéphaneChazelas Ja. Während Solaris 10 das Konzept der gesamten Distribution hatte und alle Pakete (außerhalb der nicht ausgewählten Ländereinstellungen) effektiv installierte, ist dies bei Solaris 11 nicht mehr der Fall. Ich vermute, dass die Gruppe "Solaris-Large-Server" für die POSIX-Kompatibilität verwendet wird Tests.
Juli

Antworten:

19

Bei einer vollständigen Solaris 11-Installation oder einer Desktop-Solaris 11-Installation stehen drei awk Implementierungen sowie einige Varianten zur Verfügung:

    / 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]

Sie sind alle "standardkonform", obwohl sie unterschiedlichen Standards entsprechen.

  • /usr/bin/awkentspricht der awk1977 veröffentlichten UNIX- Legacyimplementierung. Es wird zuerst im Standardsystem PATH beibehalten, um vorhandene Skripts nicht zu beschädigen, da nachfolgende awkReleases die Kompatibilität beeinträchtigen . oawkist auch ein von derawk

  • /usr/bin/nawk ist die "neue" Version von awk , die 1986 zum ersten Mal in SVR3.1 ausgeliefert wurde. Der AwkPOSIX-Standard basierte auf dieser Implementierung. /usr/xpg4/bin/awkist fast identisch mit der ersteren, wird jedoch formal anhand der POSIX-Konformitätsvalidierungstests überprüft.

  • /usr/gnu/bin/awkist auch /usr/bin/gawkdie GNU - Variante von awk. Es zielt darauf ab, den meisten oder allen POSIX-Standards zu entsprechen, wenn die Umgebungsvariable POSIXLY_CORRECTin der Umgebung festgelegt oder mit der -W posixOption aufgerufen wird , fügt aber ansonsten zahlreiche spezifische eigene Erweiterungen hinzu. igawkund pgawksind selbst Erweiterungen gawk, die erste unterstützt Include-Dateien und die zweite unterstützt die Profilerstellung.

Im Kapitel zur GNU- awkGeschichte finden Sie viele nützliche Informationen.

Bei core-oseiner regulären Solaris 11-Installation sind garantiert nur die Pakete vorhanden, also nur oawk/awkund nawkdort. Insbesondere wenn Sie eine neue nicht globale Zone erstellen , enthält diese standardmäßig das solaris-small-serverGruppenpaket, also weder dasxpg4 die gnu awkBinärdateien noch diese verfügbar sind. Dies ist beabsichtigt. Die solaris-small-serverGruppe ist ein minimaler Startpunkt, zu dem Sie die erforderlichen Pakete hinzufügen, damit Ihre Anwendungen ordnungsgemäß funktionieren. Dies ist sicherer und effizienter als die vorherige (Solaris 10) Methode, bei der alles, was in der globalen Zone installiert wurde, auch in der nicht globalen Zone installiert wurde. Sie mussten also nicht verwendete Pakete entfernen, um die Zone zu minimieren.

Damit POSIX awkin einer solchen "kleinen Server" -Installation portabel unterstützt wird, müssen Sie das installierenxcu4 Paket und PATH auf den POSIX-konformen Pfad setzen:

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

Sollten Sie aus irgendeinem Grund nicht wollen , das Paket zu installieren, eine Abhilfe ist es, eine „custom“ zu verwenden , PATHenthält nawkwie awkzB:

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

Alternativ können Sie GNU awkIhre installieren und einstellen PATH, um sie zuerst abzurufen:

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

Beachten Sie, dass dies nicht spezifisch für Solaris 11 ist. A ähnliche Paketgruppierung war bereits in Solaris 10 und früheren Versionen vorhanden, und die POSIX-kompatiblen Dienstprogramme wurden nur in den Metaclustern "Endbenutzer", "Entwickler" und "Vollständige Installation" installiert. Wenn ein System oder eine Zone mit dem Metacluster "Core" oder "Networking Support" installiert wäre, hätte dies zu genau demselben xpg4fehlenden Problem geführt.

Beachten Sie auch, dass das Fehlen von /usr/xpg4/bin/awkin einem Solaris 11-System kein POSIX-Kompatibilitätsfehler ist. Bei den meisten von Oracle und ISVs durchgeführten Tests, einschließlich des Open Group-Zertifizierungsprogramms, werden nur vollständige Solaris-Installationen verwendet . Reduzierte Installationen werden unterstützt aber nicht qualifiziert .

Wenn Sie Shell-Skripte (oder Anwendungen, die Shell-Skripte einbetten / Shell-Befehle aufrufen) für Solaris 11 verteilen, müssen Sie nur /system/xopen/xcu4eine Abhängigkeit in ihrem IPS- Paket definieren, und das Installationsprogramm führt automatisch die erforderlichen Schritte aus, damit das Skript ordnungsgemäß funktioniert:

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

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

jlliagre
quelle
3
Das Fehlen einer POSIX-kompatiblen awk ist ein POSIX-Konformitätsfehler. Ein System ohne POSIX-kompatibles awk kann keine POSIX-kompatiblen Skripts ausführen. Diese kleinen Solaris-Server sind keine POSIX- oder gar Unix-Systeme. Und ich nehme an, sie sind nicht durch das Zertifikat abgedeckt, das Solaris von der Open Group erhalten hat.
Stéphane Chazelas
1
@ StéphaneChazelas Ja, diese Systeme sind nicht qualifiziert und werden daher offensichtlich nicht behandelt. Gleiches würde passieren, wenn Solaris auf einer nicht qualifizierten Hardware installiert ist. Die POSIX / Unix-Kompatibilität ist keine Voraussetzung für die ordnungsgemäße Funktionsweise von Solaris. Solaris selbst verwendet POSIX-Dienstprogramme nicht, wenn sie sich von seinen eigenen unterscheiden.
Juli
@ StéphaneChazelas In jedem Fall ist ein POSIX awkauf einem Solaris-System oder einer nicht globalen Zone immer vorhanden, sodass es nicht um die Verfügbarkeit, sondern um den Namen des Befehls ( nawkvs awk) geht. docs.oracle.com/cd/E53394_01/html/E54763/nawk-1.html
jlliagre
1
nawkist fast POSIX (es unterstützt CONVFMTzum Beispiel nicht), aber ja, zumindest ist das nicht so schlimm wie grep(das hat nicht das POSIX -e/ -Ezum Beispiel) oder tr(das hat nicht tr a-f A-F).
Stéphane Chazelas
@ StéphaneChazelas In der Tat, Klarstellung zu meiner Antwort hinzugefügt. Vielen Dank.
Juli