POSIX Awk no Solaris 11?

13

Esta é mais ou menos uma pergunta de acompanhamento para os dois seguintes:

Vejo que no Solaris 10 (SunOS 5.10), obtenho os seguintes 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
$

No Solaris 10, /usr/bin/awknão aceita a sintaxe padrão do Awix do POSIX, como '!x[$0]++', mas /usr/xpg4/bin/awkaceita. Bom o suficiente até agora.

No entanto, no Solaris 11, existe apenas o /usr/bin/awkmesmo getconf PATH. Embora haja também nawke oawké /usr/bin, estes evidentemente não são apontados por links simbólicos de qualquer lugar.

Saber que o Solaris é certificado pela POSIX, isso me surpreendeu.

Como posso obter um Awk compatível com POSIX no Solaris 11 usando código portátil que também funcionará em outros sistemas compatíveis com POSIX? (Ou é a única opção para verificar a existência nawkou oawkusar um deles, se presente?)

Na verdade, o que são nawk e oawk?

Curinga
fonte
/usr/xpg4/bin/awknão está no Solaris 11? nawké "novo awk", uma AT&T aprimorada awk.
Kusalananda
@ StéphaneChazelas AFAIK, apenas instalações completas do sistema operacional são testadas e declaradas em conformidade ao cumprir.
Jlliagre
@jlliagre, não pode haver sistemas operacionais completos (sistemas operacionais com todos os pacotes opcionais instalados), pois isso não seria prático (também existem pacotes que são mutuamente exclusivos) e o escopo do "pacote opcional" teria que ser definido.
Stéphane Chazelas
@ StéphaneChazelas Sim. Enquanto o Solaris 10 tinha o conceito de distribuição inteira e instalou efetivamente todos os pacotes (fora os locais não selecionados), esse não é mais o caso do Solaris 11. Meu melhor palpite é que o grupo "solaris-large-server" é usado para conformidade com POSIX testes.
Jlliagre

Respostas:

19

Em uma instalação completa ou desktop do Solaris 11, há três awk implementações disponíveis, além de algumas 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]

Todos são "compatíveis com os padrões", embora estejam em conformidade com diferentes padrões.

  • /usr/bin/awkestá em conformidade com a awkimplementação legada do UNIX lançada em 1977. É mantido primeiro no PATH do sistema padrão para não interromper os scripts existentes, pois os awkreleases subsequentes quebram a compatibilidade. oawké sinônimo deawk

  • /usr/bin/nawké a versão "nova" do awk, enviada pela primeira vez no SVR3.1 em 1986. O Awkpadrão POSIX foi baseado nessa implementação. /usr/xpg4/bin/awké quase idêntico ao anterior, mas aquele que é formalmente verificado nos testes de validação de conformidade POSIX.

  • /usr/gnu/bin/awk, também /usr/bin/gawké a variante GNU de awk. Ele visa cumprir a maioria ou todos os padrões POSIX quando a variável de ambiente POSIXLY_CORRECTé configurada no ambiente ou quando chamada com a -W posixopção, mas, de outra forma, adiciona inúmeras extensões próprias específicas. igawke pgawksão elas próprias extensões gawk, o primeiro suporta arquivos incluídos e o segundo suporta a criação de perfil.

Veja também o capítulo de história do GNUawk para muitas informações úteis.

Apenas os core-ospacotes têm garantia de presença em uma instalação regular do Solaris 11, portanto, apenas oawk/awke nawkestão lá. Em particular, quando você cria uma nova região não global , ela contém por padrão o solaris-small-serverpacote do grupo para que xpg4nem os gnu awkbinários nem os estejam disponíveis. Isso ocorre por design. O solaris-small-servergrupo é um ponto de partida mínimo ao qual você adiciona os pacotes necessários para que seus aplicativos funcionem corretamente. Isso é mais seguro e eficiente do que a maneira anterior (Solaris 10) em que tudo instalado na região global também foi instalado na região não global, portanto, você precisava remover pacotes não utilizados quando desejava minimizar a região.

Para obter awksuporte POSIX de maneira portátil em uma instalação "pequena", é necessário instalar o xcu4pacote e definir PATH para o compatível com POSIX:

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

Se, por algum motivo, você não quiser instalar esse pacote, uma solução alternativa é usar um "personalizado" PATHcontendo nawkcomo awk, por exemplo:

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

Como alternativa, você pode instalar GNU awke configurar o seu PATHpara obtê-lo primeiro:

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

Observe que isso não é específico do Solaris 11. Um agrupamento de pacotes semelhante já existia no Solaris 10 e versões anteriores e os utilitários compatíveis com POSIX foram instalados apenas nos metaclusters "Usuário final", "Desenvolvedor" e "Instalação completa". A instalação de um sistema ou zona com o metacluster "Core" ou "Networking support" levaria ao mesmo xpg4problema ausente.

Observe também que a falta de /usr/xpg4/bin/awkum sistema Solaris 11 não é uma falha de conformidade com POSIX. Somente instalações completas do Solaris são usadas na grande maioria dos testes realizados pela Oracle e ISVs, incluindo o programa de certificação Open Group . Instalações reduzidas são suportadas, mas não qualificadas .

Se você distribuir scripts de shell (ou aplicativos que incorporam scripts de shell / comandos de shell de chamada) para o Solaris 11, basta definir /system/xopen/xcu4como uma dependência em seu pacote IPS e o instalador fará automaticamente o necessário para que o script funcione corretamente:

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

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

jlliagre
fonte
3
A falta de um awk compatível com POSIX é uma falha de conformidade POSIX. Um sistema que não possui um awk compatível com POSIX não pode executar scripts compatíveis com POSIX. Esses pequenos servidores solaris não são POSIX e muito menos sistemas Unix. E suponho que eles não estejam cobertos pelo certificado Solaris obtido do Open Group.
Stéphane Chazelas
1
@ StéphaneChazelas Sim, esses sistemas não são qualificados e, portanto, obviamente não são cobertos. O mesmo aconteceria se o Solaris estivesse instalado em um hardware não qualificado. A conformidade com POSIX / Unix não é um pré-requisito para o Solaris funcionar corretamente. O próprio Solaris não utiliza utilitários POSIX quando eles diferem dos seus próprios.
Jlliagre
@ StéphaneChazelas De qualquer forma, um POSIX awkestá sempre presente em um sistema Solaris ou em uma região não global, portanto, o problema não é sobre disponibilidade, mas limitado ao nome do comando ( nawkvs awk). docs.oracle.com/cd/E53394_01/html/E54763/nawk-1.html
jlliagre:
1
nawké quase POSIX (ele não suporta, CONVFMTpor exemplo), mas sim, pelo menos isso não é tão ruim quanto grep(que não possui o POSIX -e/ -Epor exemplo) ou tr(que não possui tr a-f A-F).
Stéphane Chazelas
@ StéphaneChazelas De fato, esclarecimentos foram adicionados à minha resposta. Obrigado.
Jlliagre 23/04