Saya menggunakan aplikasi command-line yang pada dasarnya adalah kumpulan skrip bash shell. Aplikasi ini ditulis untuk dijalankan pada BSD / OSX dan juga di Linux. Salah satu skrip bergantung pada awk. Ini berisi dua perintah awk: satu ditulis untuk nawk (implementasi standar BSD awk) dan satu ditulis untuk gawk (implementasi awk GNU).
Dua perintah awk yang dipermasalahkan tidak kompatibel dengan lingkungan yang berbeda; khususnya perintah nawk gagal saat dijalankan dengan gawk. Script memeriksa nama kernel (yaitu uname -s
) untuk menentukan lingkungan host, dan kemudian menjalankan perintah awk yang sesuai. Namun saya lebih suka bekerja di Mac OS X dengan utilitas inti GNU terinstal, jadi skrip gagal berjalan dengan benar.
Dalam proses berpikir tentang cara terbaik untuk memperbaiki bug ini, terpikir oleh saya bahwa akan lebih baik mengetahui bagaimana secara terprogram membedakan antara rasa yang berbeda dari utilitas baris perintah umum, lebih disukai dengan cara yang relatif kuat dan portabel.
Saya perhatikan bahwa nawk tidak menerima bendera '-V' untuk mencetak informasi versi, jadi saya pikir sesuatu seperti yang berikut ini akan berfungsi:
awk -V &>/dev/null && echo gawk || echo nawk
Variasi lain dapat berupa:
awk -Wversion &>/dev/null && echo gawk || echo nawk
Ini sepertinya berfungsi pada dua lingkungan pengujian saya (OS X dan CentOS). Ini pertanyaan saya:
- Apakah ini cara terbaik untuk pergi?
- Apakah ada cara untuk memperluas ini untuk menangani variasi awk lainnya (mis. Mawk, jawk, dll.)?
- Apakah layak khawatir tentang versi awk lainnya?
Saya juga harus menyebutkan bahwa saya tahu sedikit tentang awk.
awk -Wv
alih-alih lingkungan host
awk
yang sedang digunakan, dan kode untuk spesifikasi POSIX sebagai gantinya.