Bagaimana saya bisa dengan aman dapatkan versi ksh dari dalam skrip ksh?
Saya telah melihat solusi berikut:
ksh --versionecho ${.sh.version}echo $KSH_VERSION
Dan mengingat keadaan yang tepat, masing-masing bekerja dengan benar. Namun, saya peduli dengan kasus yang tidak sempurna.
Secara khusus, ada beberapa mesin yang bekerja dengan saya yang memiliki versi ksh yang lebih lama yang, untuk tujuan saya, sangat kurang dalam fungsionalitas. Bagaimanapun, alasan saya ingin memeriksa versi (secara terprogram) adalah untuk melihat apakah versi ksh adalah salah satu versi yang kurang mampu; dan jika demikian, saya ingin menjalankan cabang dengan kode yang kurang menarik.
Namun, pada mesin yang bermasalah, ketidakmampuan shell meluas hingga memeriksa versi…
- Jika saya mencoba
ksh --version, itu tidak mencetak apa pun dan membuka instance baruksh! -
Jika saya mencoba
echo ${.sh.version},kshmemperlakukan ini sebagai kesalahan sintaks yang tidak dapat dibuang dengan2> /dev/null.$ echo ${.sh.version} 2> /dev/null ksh: ${.sh.version}: bad substitution -
Tentu saja
echo $KSH_VERSIONtampaknya berfungsi dengan baik - maksud saya itu tidak akan macet - meskipun pada mesin ini kosong. Juga, saya melihat di suatu tempat bahwaKSH_VERSIONhanya disetel olehpdksh.
Pertanyaan:
- Bagaimana cara memeriksa versi
kshdengan aman secara terprogram? Untuk tujuan saya di sini, saya tidak terlalu peduli apa nomor versi sebenarnya, hanya apakah itu versi lama dariksh. - Apakah
$KSH_VERSIONcukup baik? Maksud saya jika kosong, makakshtentu versi yang sudah ketinggalan zaman? Apakah forum lain itu benar sehingga mungkin tidak disetel bahkan untuk versikshyang lebih baru ? - Apakah tidak ada cara untuk memeriksa ini sama sekali?
Jawaban yang Diterima:
KSH_VERSION tidak diimplementasikan di ksh93 sebelum versi 93t. Ini akan diatur dalam mksh , pdksh , lksh . Jadi untuk memeriksa versi ksh , kita bisa mencoba langkah berikut:
- Memeriksa
KSH_VERSIONuntuk mendeteksimksh,pdksh,lksh - Jika langkah pertama gagal, coba fitur yang berbeda antara
ksh93danksh88/86(Biarkan David Korn menunjukkannya kepada kita).
Dengan pemikiran ini, saya akan pergi dengan:
case "$KSH_VERSION" in
(*MIRBSD*|*PD*|*LEGACY*) printf '%sn' "$KSH_VERSION" ;;
(*) [ -z "$ERRNO" ] && printf '%sn' "${.sh.version}" || echo ksh88/86 ;;
esac