POSIX Awk на Солярис 11?

13

Это более или менее дополнительный вопрос к следующим двум:

Я вижу, что в Solaris 10 (SunOS 5.10) я получаю следующие результаты:

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

На Solaris 10 /usr/bin/awkне принимает стандартный синтаксис Awk POSIX, например '!x[$0]++', но принимает /usr/xpg4/bin/awk. Пока достаточно хорошо.

Тем не менее, на Solaris 11, есть только /usr/bin/awkдаже с getconf PATH. Хотя есть nawkи oawkесть /usr/bin, на них явно не указывают символические ссылки откуда-либо.

Зная, что Solaris сертифицирован POSIX, меня это удивило.

Как я могу получить POSIX-совместимый Awk стандартно на Solaris 11, используя переносимый код, который также будет работать на других POSIX-совместимых системах? (Или это единственный вариант проверить наличие nawkили oawkиспользовать один из них, если он есть?)

В этом отношении, что есть nawk и oawk?

Wildcard
источник
/usr/xpg4/bin/awkнет в солярисе 11? nawk"нова awk", улучшенный AT & T awk.
Кусалананда
@ StéphaneChazelas AFAIK, только полные установки ОС тестируются и объявляются как соответствующие требованиям.
jlliagre
@jlliagre, это не могут быть полные ОС (ОС со всеми установленными дополнительными пакетами), так как это не практично (есть также взаимоисключающие пакеты), и необходимо определить область действия «необязательного пакета».
Стефан
@ StéphaneChazelas Да. В то время как Solaris 10 имел концепцию полного распространения и эффективно устанавливал все пакеты (за исключением невыбранных языковых стандартов), это больше не относится к Solaris 11. Я думаю, что группа «Solaris-large-server» используется для соответствия POSIX тесты.
jlliagre

Ответы:

19

В полной или настольной установке Solaris 11 доступно три awk реализации, а также несколько вариантов:

    / 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

Все они «соответствуют стандартам», хотя и соответствуют различным стандартам.

  • /usr/bin/awkсоответствует устаревшей awkреализации UNIX, выпущенной в 1977 году. В системной переменной PATH по умолчанию она сохраняется первой, чтобы не нарушать существующие сценарии, поскольку последующие awkвыпуски нарушают совместимость. oawkявляется синонимомawk

  • /usr/bin/nawkэто «новая» версия awk, впервые выпущенная в SVR3.1 в 1986 году. AwkСтандарт POSIX был основан на этой реализации. /usr/xpg4/bin/awkпочти идентичен предыдущему, но тот, который формально проверен на соответствие тестам соответствия POSIX.

  • /usr/gnu/bin/awkтакже /usr/bin/gawkявляется вариантом GNU awk. Он направлен на то, чтобы соответствовать большинству или всем стандартам POSIX, когда переменная окружения POSIXLY_CORRECTустановлена ​​в среде или когда вызывается с -W posixопцией, но в противном случае добавляет множество конкретных собственных расширений. igawkи pgawkсами являются расширениями gawk, первый поддерживает включаемые файлы, а второй поддерживает профилирование.

Смотрите также главу истории GNUawk для получения много полезной информации.

Только core-osпакеты гарантированно присутствуют при обычной установке Solaris 11, поэтому только oawk/awkи nawkесть. В частности, когда вы создаете новую неглобальную зону , она по умолчанию содержит solaris-small-serverгрупповой пакет, поэтому xpg4ни gnu awkдвоичные файлы, ни двоичные файлы недоступны. Это по замыслу. solaris-small-serverГруппа является минимальной начальной точкой , к которой вы добавляете необходимые пакеты для ваших приложений для правильной работы. Это более безопасный и эффективный способ, чем предыдущий (Solaris 10), когда все, что установлено в глобальной зоне, было установлено и в неглобальной, поэтому вам пришлось удалять неиспользуемые пакеты, когда вы хотели минимизировать зону.

Чтобы получить POSIX- awkподдержку переносимым способом в такой «небольшой серверной» установке, вам нужно установить xcu4пакет и настроить PATH на POSIX-совместимый:

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

Должен ли по каким - то причинам вы не хотите установить этот пакет, обходной путь заключается в использовании «обычай» , PATHсодержащий , nawkкак awk, например:

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

В качестве альтернативы, вы можете установить GNU awkи настроить его, PATHчтобы получить его первым:

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

Обратите внимание, что это не относится к Solaris 11. Подобная группировка пакетов уже существовала в Solaris 10 и более ранних версиях, и совместимые с POSIX утилиты были установлены только в метакластерах «Конечный пользователь», «Разработчик» и «Полная установка». Установка системы или зоны с метакластером «Core» или «Networking support» привела бы к той же самой xpg4отсутствующей проблеме.

Также обратите внимание, что отсутствие /usr/xpg4/bin/awkв системе Solaris 11 не является ошибкой соблюдения POSIX. Только полные установки Solaris используются в подавляющем большинстве тестов, выполняемых Oracle и ISV, включая программу сертификации Open Group . Сокращенные установки поддерживаются, но не квалифицируются .

Если вы распространяете сценарии оболочки (или приложения, внедряющие сценарии оболочки / вызывая команды оболочки) для Solaris 11, вам просто нужно определить /system/xopen/xcu4как зависимость в их пакете IPS , и установщик автоматически сделает то, что требуется для правильной работы сценария:

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

См. Https://docs.oracle.com/cd/E53394_01/html/E54820/dependtypes.html.

jlliagre
источник
3
Отсутствие POSIX-совместимого awk - это ошибка соответствия POSIX. Система, которая не имеет POSIX-совместимого awk, не может запускать POSIX-совместимые сценарии. Эти small-solaris-серверы не являются POSIX, не говоря уже о Unix-системах. И я полагаю, что они не защищены сертификатом Solaris, полученным от Open Group.
Стефан
1
@ StéphaneChazelas Да, эти системы не являются квалифицированными, поэтому, очевидно, не охвачены. То же самое произошло бы, если Solaris установлен на неквалифицированном оборудовании. Соответствие POSIX / Unix не является обязательным условием нормальной работы Solaris. Сам Solaris не использует утилиты POSIX, если они отличаются от своих собственных.
jlliagre
@ StéphaneChazelas В любом случае POSIX awkвсегда присутствует в системе Solaris или неглобальной зоне, поэтому проблема не в доступности, а в ограничении имени команды ( nawkvs awk). docs.oracle.com/cd/E53394_01/html/E54763/nawk-1.html
17
1
nawkпочти POSIX (он не поддерживает, CONVFMTнапример), но да, по крайней мере, это не так плохо, как grep(у него нет POSIX -e/-E ) или tr(у него нет tr a-f A-F).
Стефан
@ StéphaneChazelas Действительно, уточнение добавлено в мой ответ. Благодарю.
jlliagre