Tôi đang sử dụng một ứng dụng dòng lệnh về cơ bản là một tập hợp các tập lệnh bash shell. Ứng dụng này được viết để chạy trên BSD / OSX và cả trên Linux. Một trong những kịch bản dựa trên awk. Nó chứa hai lệnh awk: một lệnh được viết cho nawk (triển khai awk BSD tiêu chuẩn) và một lệnh được viết cho gawk (triển khai GNU awk).
Hai lệnh awk trong câu hỏi không tương thích chéo với các môi trường khác nhau; đặc biệt là lệnh nawk thất bại khi chạy với gawk. Kịch bản kiểm tra tên kernel (tức là uname -s
) để xác định môi trường máy chủ, và sau đó chạy lệnh awk thích hợp. Tuy nhiên, tôi thích làm việc trên Mac OS X với các tiện ích lõi GNU được cài đặt, do đó tập lệnh không chạy đúng.
Trong quá trình suy nghĩ về cách tốt nhất để khắc phục lỗi này, tôi nhận ra rằng thật tuyệt khi biết cách phân biệt lập trình giữa các hương vị khác nhau của các tiện ích dòng lệnh thông thường, tốt nhất là theo cách tương đối mạnh mẽ và di động.
Tôi nhận thấy rằng nawk không chấp nhận cờ '-V' để in thông tin phiên bản, vì vậy tôi đoán rằng một cái gì đó như sau sẽ hoạt động:
awk -V &>/dev/null && echo gawk || echo nawk
Một biến thể khác có thể là:
awk -Wversion &>/dev/null && echo gawk || echo nawk
Điều này dường như hoạt động trên hai môi trường thử nghiệm của tôi (OS X và CentOS). Đây là câu hỏi của tôi:
- Đây có phải là cách tốt nhất để đi?
- Có cách nào để mở rộng điều này để xử lý các biến thể khác của awk (ví dụ: mawk, jawk, v.v.) không?
- Nó có đáng để lo lắng về các phiên bản khác của awk không?
Tôi cũng nên đề cập rằng tôi biết rất ít về awk.
awk -Wv
thay vì môi trường máy chủ
awk
đang được sử dụng và mã cho đặc tả POSIX thay thế.