POSIX Awk su Solaris 11?


13

Questa è più o meno una domanda di follow-up ai due seguenti:

Vedo che su Solaris 10 (SunOS 5.10) ottengo i seguenti risultati:

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

Su Solaris 10, /usr/bin/awknon accetta la sintassi Awk POSIX standard come '!x[$0]++', ma lo /usr/xpg4/bin/awkfa. Abbastanza buono finora.

Tuttavia, su Solaris 11, c'è solo /usr/bin/awkanche con getconf PATH. Sebbene ci sia anche nawked oawkè /usr/bin, evidentemente questi non sono indicati da symlink da nessuna parte.

Sapendo che Solaris è certificato POSIX, questo mi ha sorpreso.

Come posso ottenere un Awk conforme a POSIX standard su Solaris 11 usando un codice portatile che funzionerà anche su altri sistemi compatibili con POSIX? (O è l'unica opzione per verificare l'esistenza nawko oawkutilizzare una di queste se presente?)

Del resto, cosa sono nawk e oawk?


/usr/xpg4/bin/awknon è in Solaris 11? nawkè "nuovo awk", un AT&T migliorato awk.
Kusalananda


@ StéphaneChazelas AFAIK, solo le installazioni complete del sistema operativo sono testate e dichiarate conformi quando sono conformi.
jlliagre,

@jlliagre, non può essere un sistema operativo completo (sistemi operativi con tutti i pacchetti opzionali installati) in quanto non sarebbe pratico (ci sono anche pacchetti che si escludono a vicenda) e dovrebbe essere definito l'ambito del "pacchetto opzionale".
Stéphane Chazelas,

@ StéphaneChazelas Sì. Mentre Solaris 10 aveva il concetto di intera distribuzione e installava efficacemente tutti i pacchetti (al di fuori di quelli locali non selezionati), non è più il caso di Solaris 11. La mia ipotesi migliore è che il gruppo "solaris-large-server" sia usato per la conformità POSIX test.
jlliagre,

Risposte:


19

In un'installazione Solaris 11 completa o desktop, sono disponibili tre awk implementazioni, oltre ad alcune varianti:

    / usr / bin / awk pkg: /system/core-os@0.5.11-0.175.3.1.0.2.0
    / usr / bin / nawk           pkg: /system/core-os@0.5.11-0.175.3.1.0.2.0
    / usr / bin / oawk           pkg: /system/core-os@0.5.11-0.175.3.1.0.2.0

    / usr / gnu / bin / awk pkg: /text/gawk@3.1.8-0.175.3.0.0.30.0
    / usr / bin / gawk           pkg: /text/gawk@3.1.8-0.175.3.0.0.30.0
    / usr / bin / igawk pkg: /text/gawk@3.1.8-0.175.3.0.0.30.0
    / usr / bin / pgawk pkg: /text/gawk@3.1.8-0.175.3.0.0.30.0

    / usr / xpg4 / bin / awk       pkg: /system/xopen/xcu4@0.5.11-0.175.3.0.0.30.0

Sono tutti "conformi agli standard", sebbene conformi a standard diversi.

  • /usr/bin/awkè conforme awkall'implementazione UNIX legacy rilasciata nel 1977. Viene mantenuto per primo nel PATH di sistema predefinito per non interrompere gli script esistenti poiché le awkversioni successive rompono la compatibilità. oawkè sinonimo diawk

  • /usr/bin/nawkè la "nuova" versione di awk, distribuita per la prima volta in SVR3.1 nel 1986. Lo Awkstandard POSIX era basato su questa implementazione. /usr/xpg4/bin/awkè quasi identico al primo, ma quello che viene verificato formalmente rispetto ai test di validazione della conformità POSIX.

  • /usr/gnu/bin/awk, /usr/bin/gawkè anche la variante GNU di awk. Mira a rispettare la maggior parte o tutto lo standard POSIX quando la variabile di ambiente POSIXLY_CORRECTè impostata nell'ambiente o quando viene chiamata con l' -W posixopzione, ma in caso contrario aggiunge numerose proprie estensioni specifiche. igawke pgawksono essi stessi estensioni a gawk, il primo supporta i file include e il secondo supporta la profilazione.

Vedi anche il capitolo Cronologia GNUawk per molte informazioni utili.

Solo i core-ospacchetti sono garantiti per essere presenti su una normale installazione di Solaris 11, quindi solo oawk/awke nawkci sono. In particolare, quando si crea una nuova zona non globale , contiene per impostazione predefinita il solaris-small-serverpacchetto di gruppo in modo che xpg4né i gnu awkbinari né i siano disponibili. Questo è di progettazione. Il solaris-small-servergruppo è un punto di partenza minimo a cui aggiungere i pacchetti richiesti per il corretto funzionamento delle applicazioni. Questo è più sicuro ed efficiente rispetto al modo precedente (Solaris 10) in cui tutto ciò che era installato sulla zona globale era installato anche su quella non globale, quindi è stato necessario rimuovere i pacchetti non utilizzati quando si voleva ridurre al minimo la zona.

Per ottenere il awksupporto POSIX in modo portatile in un'installazione di "piccoli server", è necessario installare il xcu4pacchetto e impostare il PERCORSO su POSIX conforme:

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

Se per qualche motivo non si desidera installare quel pacchetto, una soluzione alternativa consiste nell'utilizzare un "personalizzato" PATHcontenente nawkcome awk, ad esempio:

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

In alternativa, potresti installarlo GNU awke impostarlo PATHper ottenerlo prima:

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

Si noti che questo non è specifico per Solaris 11. Un raggruppamento di pacchetti simile era già esistente in Solaris 10 e precedenti e le utility conformi a POSIX erano installate solo nei metacluster "Utente finale", "Sviluppatore" e "Installazione completa". Avere un sistema o una zona installati con il metacluster "Core" o "Supporto di rete" avrebbe quindi portato allo stesso xpg4problema mancante.

Si noti inoltre che la mancanza di /usr/xpg4/bin/awkun sistema Solaris 11 non è un errore di conformità POSIX. Nella maggior parte dei test eseguiti da Oracle e ISV vengono utilizzate solo installazioni Solaris complete, incluso il programma di certificazione Open Group . Le installazioni ridotte sono supportate ma non qualificate .

Se si distribuiscono script di shell (o applicazioni che incorporano script di shell / comandi di chiamata shell) per Solaris 11, è sufficiente definire /system/xopen/xcu4una dipendenza nel loro pacchetto IPS e il programma di installazione farà automaticamente ciò che è necessario affinché lo script funzioni correttamente:

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

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


3
La mancanza di un awk conforme a POSIX è un errore di conformità POSIX. Un sistema che non ha un awk conforme a POSIX non può eseguire script conformi a POSIX. Quei server small solaris non sono POSIX e tanto meno i sistemi Unix. E suppongo che non siano coperti dal certificato che Solaris ha ottenuto da Open Group.
Stéphane Chazelas,

1
@ StéphaneChazelas Sì, questi sistemi non sono qualificati, quindi ovviamente non sono coperti. Lo stesso accadrebbe se Solaris è installato su un hardware non qualificato. La conformità POSIX / Unix non è un prerequisito per il corretto funzionamento di Solaris. La stessa Solaris non fa uso delle utility POSIX quando differiscono dalle proprie.
jlliagre,

@ StéphaneChazelas In ogni caso, un POSIX awkè sempre presente su un sistema Solaris o in una zona non globale, quindi il problema non riguarda la disponibilità ma è limitato al nome del comando ( nawkvs awk). docs.oracle.com/cd/E53394_01/html/E54763/nawk-1.html
jlliagre

1
nawkè quasi POSIX (non supporta CONVFMTad esempio), ma sì, almeno non è così male come grep(che non ha POSIX -e/ -Ead esempio) o tr(che non ha tr a-f A-F).
Stéphane Chazelas il

@ StéphaneChazelas Effettivamente, chiarimento aggiunto alla mia risposta. Grazie.
jlliagre,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.