POSIX Awk на Solaris 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?


/usr/xpg4/bin/awkнемає в Solaris 11? nawkє "новим awk", покращеним AT&T awk.
Kusalananda


@ StéphaneChazelas AFAIK, лише повні установки ОС тестуються та оголошуються відповідними при відповідності.
jlliagre

@jlliagre, це не можуть бути повноцінні ОС (ОС із усіма встановленими необов'язковими пакетами), як це не було б практично (є також пакети, які взаємно виключають), і область "необов'язкового пакета" повинна бути визначена.
Стефан Шазелас

@ StéphaneChazelas Так. Хоча Solaris 10 мав концепцію повного розподілу і ефективно встановлював усі пакети (за межами невибраних локальних), це більше не стосується Solaris 11. Моя найкраща здогадка, що група "solaris-великий-сервер" використовується для відповідності 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) спосіб, коли все, що встановлено в глобальній зоні, було встановлено і на не глобальній, тому вам довелося видаляти невикористані пакети, коли ви хотіли мінімізувати зону.

Щоб отримати awkпідтримку POSIX портативним способом в такій установці на "невеликий сервер", вам потрібно встановити 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. У переважній більшості випробувань, проведених Oracle та ISV, включаючи програму сертифікації Open Group , використовуються лише повні установки Solaris . Скорочені установки підтримуються, але не кваліфікуються .

Якщо ви розповсюджуєте скрипти оболонок (або програми, що вбудовують скрипти оболонок / виклику команд оболонки) для 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


3
Відсутність awk сумісного з POSIX - це збій у відповідності POSIX. Система, яка не підтримує POSIX, не може запускати сценарії, сумісні з POSIX. Ці сервери малих сонячних батарей не є 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
jlliagre

1
nawkмайже POSIX (він не підтримує, CONVFMTнаприклад), але так, принаймні, це не так вже й погано, як grep(у POSIX -e/ -Eнаприклад немає) або tr(у цьому немає tr a-f A-F).
Стефан Шазелас

@ StéphaneChazelas Дійсно, до моєї відповіді було додано уточнення. Спасибі.
jlliagre
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.