POSIX Awk sur Solaris 11?

13

Il s'agit plus ou moins d'une question complémentaire aux deux suivantes:

Je vois que sur Solaris 10 (SunOS 5.10), j'obtiens les résultats suivants:

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

Sous Solaris 10, /usr/bin/awkn'accepte pas la syntaxe Awk standard POSIX telle que '!x[$0]++', mais le /usr/xpg4/bin/awkfait. Assez bien jusqu'à présent.

Cependant, sur Solaris 11, il n'y a /usr/bin/awkmême qu'avec getconf PATH. Bien qu'il y ait aussi nawket oawkest /usr/bin, ceux-ci ne sont évidemment pas signalés par des liens symboliques de n'importe où.

Sachant que Solaris est certifié POSIX, cela m'a surpris.

Comment puis-je obtenir un Awk conforme POSIX en standard sur Solaris 11 en utilisant un code portable qui fonctionnera également sur d'autres systèmes conformes POSIX? (Ou est-ce la seule option pour vérifier l'existence de nawket oawket utiliser l'un d'eux si présent?)

D'ailleurs, quels sont nawk et oawk?

Caractère générique
la source
/usr/xpg4/bin/awkn'est pas dans Solaris 11? nawkest "nouveau awk", un AT&T amélioré awk.
Kusalananda
@ StéphaneChazelas AFAIK, seules les installations OS complètes sont testées et déclarées conformes lors de la conformité.
jlliagre
@jlliagre, il ne peut pas s'agir de systèmes d'exploitation complets (systèmes d'exploitation avec tous les packages optionnels installés) car cela ne serait pas pratique (il existe également des packages qui s'excluent mutuellement) et la portée du "package facultatif" devrait être définie.
Stéphane Chazelas
@ StéphaneChazelas Oui. Alors que Solaris 10 avait le concept de distribution complète et installait efficacement tous les packages (en dehors des paramètres régionaux non sélectionnés), ce n'est plus le cas avec Solaris 11. Ma meilleure supposition est que le groupe "solaris-large-server" est utilisé pour la conformité POSIX tests.
jlliagre

Réponses:

19

Sur une installation Solaris 11 complète ou de bureau, trois awk implémentations sont disponibles, plus quelques variantes:

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

Ils sont tous "conformes aux normes", bien que conformes à des normes différentes.

  • /usr/bin/awkest conforme à l' awkimplémentation UNIX héritée publiée en 1977. Il est conservé en premier dans le système par défaut PATH pour ne pas casser les scripts existants car les awkversions suivantes rompent la compatibilité. oawkest synonyme deawk

  • /usr/bin/nawkest la "nouvelle" version de awk, livrée pour la première fois en SVR3.1 en 1986. La Awknorme POSIX était basée sur cette implémentation. /usr/xpg4/bin/awkest presque identique au premier, mais celui qui est formellement vérifié par rapport aux tests de validation de conformité POSIX.

  • /usr/gnu/bin/awk, /usr/bin/gawkest également la variante GNU de awk. Il vise à se conformer à la plupart ou à la totalité de la norme POSIX lorsque la variable d'environnement POSIXLY_CORRECTest définie dans l'environnement ou lorsqu'elle est appelée avec l' -W posixoption, mais ajoute de nombreuses extensions propres spécifiques. igawket pgawksont eux-mêmes des extensions gawk, le premier prend en charge les fichiers et le second prend en charge le profilage.

Voir aussi le chapitre historique GNUawk pour de nombreuses informations utiles.

Seuls les core-ospackages sont garantis pour être présents sur une installation régulière de Solaris 11, donc uniquement oawk/awket nawksont là. En particulier, lorsque vous créez une nouvelle zone non globale , elle contient par défaut le solaris-small-serverpackage de groupe, donc ni le xpg4ni les gnu awkbinaires ne sont disponibles. C'est par conception. Le solaris-small-servergroupe est un point de départ minimal auquel vous ajoutez les packages requis pour que vos applications fonctionnent correctement. C'est plus sûr et plus efficace que la méthode précédente (Solaris 10) où tout installé sur la zone globale était également installé sur la zone non globale, vous avez donc dû supprimer les packages inutilisés lorsque vous vouliez réduire la zone.

Pour obtenir la awkprise en charge POSIX de manière portable dans une telle installation de "petit serveur", vous devez installer le xcu4package et définir votre PATH sur celui conforme POSIX:

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

Si pour une raison quelconque vous ne souhaitez pas installer ce package, une solution de contournement consiste à utiliser un "personnalisé" PATHcontenant nawkcomme awk, par exemple:

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

Vous pouvez également installer GNU awket configurer votre PATHpour l'obtenir en premier:

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

Notez que cela n'est pas spécifique à Solaris 11. Un regroupement de packages similaire existait déjà sous Solaris 10 et versions antérieures et les utilitaires compatibles POSIX n'étaient installés que dans les métaclusters "Utilisateur final", "Développeur" et "Installation complète". Le fait d'avoir un système ou une zone installé avec le métacluster «Core» ou «Networking support» aurait alors conduit au même xpg4problème manquant.

Notez également que l'absence d' /usr/xpg4/bin/awkun système Solaris 11 n'est pas un échec de conformité POSIX. Seules les installations complètes de Solaris sont utilisées dans la grande majorité des tests effectués par Oracle et les éditeurs de logiciels indépendants, y compris le programme de certification Open Group . Les installations réduites sont prises en charge mais non qualifiées .

Si vous distribuez des scripts shell (ou des applications intégrant des scripts shell / appelant des commandes shell) pour Solaris 11, il vous suffit de définir /system/xopen/xcu4une dépendance dans leur package IPS et le programme d'installation fera automatiquement ce qui est requis pour que le script fonctionne correctement:

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

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

jlliagre
la source
3
L'absence d'un awk compatible POSIX est un échec de conformité POSIX. Un système qui n'a pas un awk compatible POSIX ne peut pas exécuter de scripts conformes POSIX. Ces petits serveurs Solaris ne sont pas des systèmes POSIX et encore moins des systèmes Unix. Et je suppose qu'ils ne sont pas couverts par le certificat Solaris obtenu auprès de l'Open Group.
Stéphane Chazelas
1
@ StéphaneChazelas Oui, ces systèmes ne sont pas qualifiés donc ne sont évidemment pas couverts. La même chose se produirait si Solaris est installé sur un matériel non qualifié. La conformité POSIX / Unix n'est pas une condition préalable au bon fonctionnement de Solaris. Solaris lui-même n'utilise pas les utilitaires POSIX lorsqu'ils diffèrent des siens.
jlliagre
@ StéphaneChazelas Dans tous les cas, un POSIX awkest toujours présent sur un système Solaris ou une zone non globale donc le problème n'est pas sur la disponibilité mais limité au nom de la commande ( nawkvs awk). docs.oracle.com/cd/E53394_01/html/E54763/nawk-1.html
jlliagre
1
nawkest presque POSIX (il ne supporte pas CONVFMTpar exemple), mais oui, au moins ce n'est pas aussi mauvais que grep(qui n'a pas le POSIX -e/ -Epar exemple) ou tr(qui n'en a pas tr a-f A-F).
Stéphane Chazelas
@ StéphaneChazelas En effet, une précision s'ajoute à ma réponse. Merci.
jlliagre