POSIX Awk di Solaris 11?

13

Ini adalah pertanyaan tindak lanjut untuk dua berikut:

Saya melihat bahwa pada Solaris 10 (SunOS 5.10), saya mendapatkan hasil berikut:

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

Pada Solaris 10, /usr/bin/awktidak menerima sintaks Awk standar POSIX seperti '!x[$0]++', tetapi /usr/xpg4/bin/awktidak. Cukup bagus sejauh ini.

Namun, pada Solaris 11, hanya ada /usr/bin/awkbahkan dengan getconf PATH. Meskipun ada nawkdan oawkada /usr/bin, ini jelas tidak ditunjukkan oleh symlink dari mana saja.

Mengetahui bahwa Solaris bersertifikat POSIX, ini mengejutkan saya.

Bagaimana saya bisa mendapatkan Awk yang memenuhi syarat POSIX secara standar pada Solaris 11 menggunakan kode portabel yang juga akan bekerja pada sistem yang sesuai dengan POSIX lainnya? (Atau apakah satu-satunya pilihan untuk memeriksa keberadaan nawkatau oawkdan menggunakan salah satunya jika ada?)

Untuk itu, apa yang nawk dan oawk?

Wildcard
sumber
/usr/xpg4/bin/awktidak ada dalam Solaris 11? nawkadalah "baru awk", AT&T yang ditingkatkan awk.
Kusalananda
@ StéphaneChazelas AFAIK, hanya instalasi OS lengkap yang diuji dan dinyatakan sesuai saat mematuhi.
jlliagre
@ jlliagre, itu tidak bisa OS penuh (OS dengan semua paket opsional diinstal) karena itu tidak praktis (ada juga paket yang saling eksklusif) dan ruang lingkup "paket opsional" harus ditentukan.
Stéphane Chazelas
@ StéphaneChazelas Ya. Sementara Solaris 10 memiliki konsep seluruh distribusi dan secara efektif menginstal semua paket (di luar yang tidak dipilih), ini tidak lagi halnya dengan Solaris 11. Tebakan terbaik saya adalah grup "solaris-besar-server" yang digunakan untuk kepatuhan POSIX tes.
jlliagre

Jawaban:

19

Pada instalasi Solaris 11 penuh atau desktop, ada tiga awk implementasi yang tersedia, ditambah beberapa varian:

    / 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]

Mereka semua "memenuhi standar", meskipun mematuhi standar yang berbeda.

  • /usr/bin/awkmematuhi awkimplementasi UNIX lama yang dirilis pada tahun 1977. Itu disimpan pertama kali dalam sistem PATH default untuk tidak melanggar skrip yang ada sebagai awkrilis berikutnya istirahat kompatibilitas. oawkadalah sinonim dariawk

  • /usr/bin/nawkadalah versi "baru" dari awk, pertama kali dikirim dalam SVR3.1 pada tahun 1986. AwkStandar POSIX didasarkan pada implementasi ini. /usr/xpg4/bin/awkhampir identik dengan yang pertama, tetapi yang secara formal diperiksa terhadap tes validasi kesesuaian POSIX.

  • /usr/gnu/bin/awk, juga /usr/bin/gawkmerupakan varian GNU dari awk. Ini bertujuan untuk mematuhi sebagian besar atau semua standar POSIX ketika variabel lingkungan POSIXLY_CORRECTdiatur di lingkungan atau ketika dipanggil dengan -W posixopsi tetapi sebaliknya menambahkan banyak ekstensi sendiri. igawkdan pgawkitu sendiri ekstensi untuk gawk, yang pertama mendukung termasuk file dan yang kedua mendukung profil.

Lihat juga bab sejarah GNUawk untuk banyak informasi berguna.

Hanya core-ospaket-paket yang dijamin hadir pada instalasi reguler Solaris 11, dengan demikian hanya oawk/awkdan nawkada di sana. Secara khusus, ketika Anda membuat zona non global , itu berisi secara default solaris-small-serverpaket grup sehingga biner xpg4maupun gnu awkbiner tidak tersedia. Ini dengan desain. The solaris-small-servergroup adalah titik awal minimal yang Anda tambahkan paket yang dibutuhkan untuk aplikasi Anda untuk benar bekerja. Ini lebih aman dan efisien daripada cara sebelumnya (Solaris 10) di mana segala sesuatu yang terinstal di zona global juga diinstal pada yang non global sehingga Anda harus menghapus paket yang tidak digunakan ketika Anda ingin meminimalkan zona tersebut.

Untuk mendapatkan awkdukungan POSIX dengan cara portabel dalam instalasi "server kecil", Anda perlu menginstal xcu4paket dan mengatur PATH Anda ke yang sesuai dengan POSIX:

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

Haruskah untuk beberapa alasan Anda tidak ingin menginstal paket itu, solusi adalah dengan menggunakan "kebiasaan" PATHyang mengandung nawksebagai awk, misalnya:

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

Atau, Anda dapat menginstal GNU awkdan mengatur Anda PATHuntuk mendapatkannya terlebih dahulu:

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

Perhatikan bahwa ini tidak khusus untuk Solaris 11. Pengelompokan paket yang serupa sudah ada di bawah Solaris 10 dan sebelumnya dan utilitas yang sesuai dengan POSIX hanya diinstal pada metaclusters "Pengguna Akhir", "Pengembang" dan "Instalasi penuh". Memiliki sistem atau zona yang diinstal dengan "Core" atau "Networking support" metacluster kemudian akan mengarah pada xpg4masalah yang hilang sama .

Perhatikan juga bahwa kurangnya /usr/xpg4/bin/awksistem Solaris 11 bukan kegagalan kepatuhan POSIX. Hanya instalasi Solaris lengkap yang digunakan dalam sebagian besar pengujian yang dilakukan oleh Oracle dan ISV, termasuk program sertifikasi Open Group . Instalasi yang dikurangi didukung tetapi tidak memenuhi syarat .

Jika Anda mendistribusikan skrip shell (atau aplikasi yang menyematkan skrip shell / perintah shell panggilan) untuk Solaris 11, Anda hanya perlu mendefinisikan /system/xopen/xcu4sebagai dependensi dalam paket IPS mereka dan installer akan secara otomatis melakukan apa yang diperlukan agar skrip bekerja dengan benar:

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

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

Jlliagre
sumber
3
Kurangnya POSK yang memenuhi persyaratan POSIX adalah kegagalan kepatuhan POSIX. Sistem yang tidak memiliki awalan POSIX yang sesuai tidak dapat menjalankan skrip yang sesuai dengan POSIX. Server-server kecil itu bukan POSIX apalagi sistem Unix. Dan saya kira mereka tidak dilindungi oleh sertifikat Solaris yang diperoleh dari Open Group.
Stéphane Chazelas
1
@ StéphaneChazelas Ya, sistem ini tidak memenuhi syarat sehingga jelas tidak tercakup. Hal yang sama akan terjadi jika Solaris diinstal pada perangkat keras yang tidak memenuhi syarat. Kepatuhan POSIX / Unix bukanlah prasyarat bagi Solaris untuk bekerja dengan benar. Solaris sendiri tidak menggunakan utilitas POSIX saat berbeda dari miliknya sendiri.
jlliagre
@ StéphaneChazelas Bagaimanapun, POSIX awkselalu hadir pada sistem Solaris atau zona non global sehingga masalahnya bukan tentang ketersediaan tetapi terbatas pada nama perintah ( nawkvs awk). docs.oracle.com/cd/E53394_01/html/E54763/nawk-1.html
jlliagre
1
nawkhampir POSIX (tidak mendukung CONVFMTmisalnya), tapi ya, setidaknya itu tidak seburuk grep(yang tidak memiliki POSIX -e/ -Emisalnya) atau tr(yang tidak memiliki tr a-f A-F).
Stéphane Chazelas
@ StéphaneChazelas Memang, klarifikasi ditambahkan ke balasan saya. Terima kasih.
jlliagre