POSIX Awk en Solaris 11?

13

Esta es más o menos una pregunta de seguimiento a las siguientes dos:

Veo que en Solaris 10 (SunOS 5.10), obtengo los siguientes resultados:

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

En Solaris 10, /usr/bin/awkno acepta la sintaxis Awk estándar POSIX como '!x[$0]++', pero /usr/xpg4/bin/awksí. Lo suficientemente bueno hasta ahora.

Sin embargo, en Solaris 11, solo hay /usr/bin/awkincluso con getconf PATH. Aunque también existe nawky oawkexiste /usr/bin, estos evidentemente no son señalados por enlaces simbólicos desde cualquier lugar.

Sabiendo que Solaris tiene certificación POSIX, esto me sorprendió.

¿Cómo puedo obtener un Awk compatible con POSIX de manera estándar en Solaris 11 usando un código portátil que también funcionará en otros sistemas compatibles con POSIX? (¿O es la única opción para verificar la existencia de nawko oawkusar uno de estos si está presente?)

Para el caso, ¿qué son nawk y oawk?

Comodín
fuente
/usr/xpg4/bin/awkno está en Solaris 11? nawkes "nuevo awk", un AT&T mejorado awk.
Kusalananda
@ StéphaneChazelas AFAIK, solo las instalaciones completas del sistema operativo se prueban y se declaran conformes al cumplir.
jlliagre
@jlliagre, no pueden ser sistemas operativos completos (sistemas operativos con todos los paquetes opcionales instalados) ya que eso no sería práctico (también hay paquetes que son mutuamente excluyentes) y el alcance del "paquete opcional" debería definirse.
Stéphane Chazelas
@ StéphaneChazelas Sí. Si bien Solaris 10 tenía el concepto de distribución completa e instaló efectivamente todos los paquetes (fuera de los entornos locales no seleccionados), este ya no es el caso con Solaris 11. Mi mejor conjetura es que el grupo "solaris-large-server" se utiliza para el cumplimiento de POSIX pruebas
jlliagre

Respuestas:

19

En una instalación de Solaris 11 completa o de escritorio, hay tres awk implementaciones disponibles, más algunas 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 paquete: /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]

Todos son "compatibles con los estándares", aunque cumplen con diferentes estándares.

  • /usr/bin/awkestá cumpliendo con la awkimplementación heredada de UNIX lanzada en 1977. Se mantiene primero en la RUTA predeterminada del sistema para no romper los scripts existentes ya que las awkversiones posteriores rompen la compatibilidad. oawkes sinónimo deawk

  • /usr/bin/nawkes la "nueva" versión de awk, enviada por primera vez en SVR3.1 en 1986. El Awkestándar POSIX se basó en esta implementación. /usr/xpg4/bin/awkes casi idéntico al anterior, pero el que se verifica formalmente con las pruebas de validación de conformidad POSIX.

  • /usr/gnu/bin/awk, también /usr/bin/gawkes la variante GNU de awk. Su objetivo es cumplir con la mayoría o la totalidad del estándar POSIX cuando la variable de entorno POSIXLY_CORRECTse establece en el entorno o cuando se llama con la -W posixopción, pero de lo contrario agrega numerosas extensiones propias específicas. igawky pgawkson extensiones en sí mismas gawk, la primera admite incluir archivos y la segunda admite la creación de perfiles.

Consulte también el capítulo de historia de GNUawk para obtener mucha información útil.

Sólo los core-ospaquetes están garantizados para estar presentes en una instalación normal de Solaris 11, por lo tanto sólo oawk/awky nawkestán ahí. En particular, cuando crea una nueva zona no global , contiene de manera predeterminada el solaris-small-serverpaquete de grupo, de modo que xpg4ni el gnu awkbinario ni el otro están disponibles. Esto es por diseño. El solaris-small-servergrupo es un punto de inicio mínimo al que agrega los paquetes necesarios para que sus aplicaciones funcionen correctamente. Esto es más seguro y eficiente que la forma anterior (Solaris 10) donde todo lo instalado en la zona global también se instaló en la no global, por lo que tuvo que eliminar los paquetes no utilizados cuando quería minimizar la zona.

Para conseguir que POSIX awkadmita una instalación portátil en una instalación de "servidor pequeño" de este tipo, debe instalar el xcu4paquete y configurar su RUTA en el que cumple con POSIX:

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

Si por alguna razón no desea instalar ese paquete, una solución alternativa es usar un "personalizado" que PATHcontenga nawkcomo awk, por ejemplo:

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

Alternativamente, puede instalarlo GNU awky configurarlo PATHpara obtenerlo primero:

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

Tenga en cuenta que esto no es específico de Solaris 11. Ya existía una agrupación de paquetes similar en Solaris 10 y anteriores, y las utilidades compatibles con POSIX solo se instalaron en los metaclusters "Usuario final", "Desarrollador" y "Instalación completa". Tener un sistema o una zona instalados con el metacluster "Core" o "Networking support" habría llevado al mismo xpg4problema que falta.

Tenga en cuenta también que la falta de /usr/xpg4/bin/awkun sistema Solaris 11 no es una falla de cumplimiento POSIX. Solo se utilizan instalaciones completas de Solaris en la gran mayoría de las pruebas realizadas por Oracle e ISV, incluido el programa de certificación Open Group . Las instalaciones reducidas son compatibles pero no están calificadas .

Si distribuye scripts de shell (o aplicaciones que incorporan scripts de shell / invocando comandos de shell) para Solaris 11, solo necesita definirlo /system/xopen/xcu4como una dependencia en su paquete IPS y el instalador hará automáticamente lo que se requiere para que el script funcione correctamente:

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

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

jlliagre
fuente
3
La falta de un awk compatible con POSIX es una falla de conformidad POSIX. Un sistema que no tiene un awk compatible con POSIX no puede ejecutar scripts compatibles con POSIX. Esos pequeños servidores solaris no son POSIX y mucho menos sistemas Unix. Y supongo que no están cubiertos por el certificado que Solaris obtuvo del Open Group.
Stéphane Chazelas
1
@ StéphaneChazelas Sí, estos sistemas no están calificados, por lo que obviamente no están cubiertos. Lo mismo sucedería si Solaris se instala en un hardware no calificado. El cumplimiento de POSIX / Unix no es un requisito previo para que Solaris funcione correctamente. Solaris en sí no utiliza las utilidades POSIX cuando difieren de las propias.
jlliagre
@ StéphaneChazelas En cualquier caso, un POSIX awksiempre está presente en un sistema Solaris o en una zona no global, por lo que el problema no se trata de disponibilidad sino que se limita al nombre del comando ( nawkvs awk). docs.oracle.com/cd/E53394_01/html/E54763/nawk-1.html
jlliagre
1
nawkes casi POSIX (no es compatible, CONVFMTpor ejemplo), pero sí, al menos eso no es tan malo como grep(que no tiene POSIX -e/ -Epor ejemplo) o tr(que no tiene tr a-f A-F).
Stéphane Chazelas
@ StéphaneChazelas De hecho, se agregó una aclaración a mi respuesta. Gracias.
jlliagre