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.
sumber
awk -Wv
alih-alih lingkungan hostawk
yang sedang digunakan, dan kode untuk spesifikasi POSIX sebagai gantinya.Jawaban:
Atau, tes awk adalah tautan simbolik:
sumber
Coba gunakan
which
perintah dan gunakan kode keluarnya.lalu format skrip Anda untuk menggunakan variabel sebagai perintah
akan dibaca sebagai
jika
which
ditemukan nawk. Kalau tidak, itu akan digunakangawk
sumber
command
bash builtin Anda mungkin ingin menggunakan nama yang berbeda untuk variabel Anda, dan Anda mungkin juga ingin melihat jawaban yang sangat terperinci tentang mengapa bagi banyak shell ada alternatif yang lebih baikwhich
di unix.stackexchange.com/a/85250/109842GNU Awk sering diinstal sebagai
gawk
, denganawk
sebagai symlink untuknya pada sistem di mana GNU adalah default. Saya kira ini adalah kasus pada sistem BSD dan OS X, karena mereka sudah memiliki sendiriawk
.sumber
Retasan kotor
nawk-only-function()
hanya ada dinawk
sumber
Saya mungkin akan mencoba menyalahgunakan AC_PROG_AWK m4 makro di autoconf untuk memilih satu, memesannya dengan tepat. Ini mungkin berlebihan meskipun
sumber