POSIX Awk trên Solaris 11?


13

Đây ít nhiều là một câu hỏi tiếp theo cho hai câu hỏi sau:

Tôi thấy rằng trên Solaris 10 (SunOS 5.10), tôi nhận được các kết quả sau:

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

Trên Solaris 10, /usr/bin/awkkhông chấp nhận cú pháp Awk tiêu chuẩn POSIX như '!x[$0]++', nhưng /usr/xpg4/bin/awkcó. Đủ tốt cho đến nay

Tuy nhiên, trên Solaris 11, chỉ có /usr/bin/awkngay cả với getconf PATH. Mặc dù cũng có nawkoawk/usr/bin, những thứ này rõ ràng không được chỉ ra bởi các liên kết từ bất cứ đâu.

Biết rằng Solaris được chứng nhận POSIX, điều này làm tôi ngạc nhiên.

Làm cách nào tôi có thể nhận Awk tuân thủ POSIX theo tiêu chuẩn trên Solaris 11 bằng mã di động cũng sẽ hoạt động trên các hệ thống tuân thủ POSIX khác? (Hoặc là tùy chọn duy nhất để kiểm tra sự tồn tại của nawkhoặc oawksử dụng một trong những tùy chọn này nếu có?)

Cho rằng vấn đề, những gì đang nawkoawk?


/usr/xpg4/bin/awkkhông có trong Solaris 11? nawklà "mới awk", một AT & T được cải tiến awk.
Kusalananda


@ StéphaneChazelas AFAIK, chỉ cài đặt hệ điều hành đầy đủ mới được kiểm tra và tuyên bố tuân thủ khi tuân thủ.
jlliagre

@jlliagre, nó không thể là hệ điều hành đầy đủ (Hệ điều hành có cài đặt tất cả các gói tùy chọn) vì điều đó sẽ không thực tế (cũng có các gói loại trừ lẫn nhau) và phải xác định phạm vi của "gói tùy chọn".
Stéphane Chazelas

@ StéphaneChazelas Có. Mặc dù Solaris 10 có khái niệm về toàn bộ phân phối và cài đặt hiệu quả tất cả các gói (bên ngoài các gói địa phương không được chọn), nhưng đây không phải là trường hợp của Solaris 11. Dự đoán tốt nhất của tôi là nhóm "máy chủ mặt trời lớn" được sử dụng để tuân thủ POSIX xét nghiệm.
jlliagre

Câu trả lời:


19

Trên bản cài đặt Solaris 11 đầy đủ hoặc dành cho máy tính để bàn, có ba awk triển khai có sẵn, cùng với một số biến thể:

    / 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

Tất cả đều "tuân thủ tiêu chuẩn", mặc dù tuân thủ các tiêu chuẩn khác nhau.

  • /usr/bin/awkđang tuân thủ awktriển khai UNIX kế thừa được phát hành vào năm 1977. Nó được giữ đầu tiên trong hệ thống mặc định PATH không phá vỡ các tập lệnh hiện có khi các awkbản phát hành tiếp theo phá vỡ tính tương thích. oawklà một từ đồng nghĩa củaawk

  • /usr/bin/nawklà phiên bản "mới" của awk, lần đầu tiên được xuất xưởng trong SVR3.1 vào năm 1986. AwkTiêu chuẩn POSIX dựa trên việc triển khai này. /usr/xpg4/bin/awkgần như giống hệt với cái trước, nhưng cái được kiểm tra chính thức đối với các thử nghiệm xác nhận tuân thủ POSIX.

  • /usr/gnu/bin/awk, cũng /usr/bin/gawklà biến thể GNU của awk. Nó nhằm mục đích tuân thủ hầu hết hoặc tất cả các tiêu chuẩn POSIX khi biến môi trường POSIXLY_CORRECTđược đặt trong môi trường hoặc khi được gọi với -W posixtùy chọn nhưng mặt khác lại thêm nhiều tiện ích mở rộng cụ thể. igawkpgawkbản thân chúng là các phần mở rộng gawk, phần đầu tiên hỗ trợ bao gồm các tệp và phần thứ hai hỗ trợ lược tả.

Xem thêm chương lịch sử GNUawk để biết nhiều thông tin hữu ích.

Chỉ các core-osgói được đảm bảo có mặt trên bản cài đặt thông thường của Solaris 11, do đó chỉ oawk/awknawkcó ở đó. Đặc biệt, khi bạn tạo ra một khu vực mới không toàn cầu , nó chứa theo mặc định các solaris-small-servergói nhóm nên không những xpg4cũng không phải là gnu awkmã nhị phân có sẵn. Đây là do thiết kế. Các solaris-small-servernhóm là một điểm khởi đầu tối thiểu mà bạn thêm các gói cần thiết cho các ứng dụng của bạn để làm tốt công tác. Cách này an toàn và hiệu quả hơn so với cách trước (Solaris 10) trước đây, nơi mọi thứ được cài đặt trên khu vực toàn cầu cũng được cài đặt trên khu vực không toàn cầu, do đó bạn phải xóa các gói không sử dụng khi bạn muốn giảm thiểu vùng.

Để có được POSIX awkhỗ trợ một cách di động trong quá trình cài đặt "máy chủ nhỏ" như vậy, bạn cần cài đặt xcu4gói và đặt PATH cho phù hợp với POSIX:

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

Có nên đối với một số lý do bạn không muốn cài đặt gói phần mềm đó, một cách giải quyết là sử dụng một "tùy chỉnh" PATHchứa nawknhư awk, ví dụ như:

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

Ngoài ra, bạn có thể cài đặt GNU awkvà thiết lập PATHđể có được nó trước:

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

Lưu ý rằng điều này không dành riêng cho Solaris 11. Một nhóm gói tương tự đã tồn tại trong Solaris 10 trở về trước và các tiện ích tuân thủ POSIX chỉ được cài đặt trong các siêu dữ liệu "Người dùng cuối", "Nhà phát triển" và "Cài đặt đầy đủ". Có một hệ thống hoặc một khu vực được cài đặt với siêu dữ liệu "Lõi" hoặc "Hỗ trợ kết nối mạng" sau đó sẽ dẫn đến xpg4vấn đề rất thiếu.

Cũng lưu ý rằng việc thiếu /usr/xpg4/bin/awktrong hệ thống Solaris 11 không phải là lỗi tuân thủ POSIX. Chỉ cài đặt Solaris đầy đủ được sử dụng trong phần lớn các thử nghiệm được thực hiện bởi Oracle và ISV, bao gồm cả chương trình chứng nhận Open Group . Giảm cài đặt được hỗ trợ nhưng không đủ điều kiện .

Nếu bạn phân phối tập lệnh shell (hoặc ứng dụng nhúng tập lệnh shell / gọi lệnh shell) cho Solaris 11, bạn chỉ cần xác định /system/xopen/xcu4là phụ thuộc trong gói IPS của chúng và trình cài đặt sẽ tự động làm những gì cần thiết để tập lệnh hoạt động chính xác:

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

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


3
Việc thiếu một awk tuân thủ POSIX là một lỗi phù hợp POSIX. Một hệ thống không có awk tuân thủ POSIX không thể chạy các tập lệnh tuân thủ POSIX. Những máy chủ năng lượng mặt trời nhỏ đó không phải là POSIX chứ đừng nói đến các hệ thống Unix. Và tôi cho rằng họ không được bảo vệ bởi chứng chỉ Solaris có được từ Nhóm Mở.
Stéphane Chazelas

1
@ StéphaneChazelas Có, các hệ thống này không đủ điều kiện nên rõ ràng là không được bảo hiểm. Điều tương tự sẽ xảy ra nếu Solaris được cài đặt trên một phần cứng không đủ điều kiện. Tuân thủ POSIX / Unix không phải là điều kiện tiên quyết để Solaris hoạt động bình thường. Bản thân Solaris không sử dụng các tiện ích POSIX khi chúng khác với các tiện ích của chính nó.
jlliagre

@ StéphaneChazelas Trong mọi trường hợp, POSIX awkluôn có mặt trên hệ thống Solaris hoặc khu vực không toàn cầu, vì vậy vấn đề không nằm ở tính khả dụng mà chỉ giới hạn ở tên của lệnh ( nawkvs awk). docs.oracle.com/cd/E53394_01/html/E54763/nawk-1.html
jlliagre

1
nawkgần như là POSIX ( CONVFMTchẳng hạn như nó không hỗ trợ ), nhưng vâng, ít nhất điều đó không tệ như grep( chẳng hạn như POSIX -e/ -Echẳng hạn) hoặc tr(điều đó không có tr a-f A-F).
Stéphane Chazelas

@ StéphaneChazelas Thật vậy, làm rõ thêm vào câu trả lời của tôi. Cảm ơn.
jlliagre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.