Bagaimana saya bisa dengan aman dapatkan versi ksh dari dalam skrip ksh?
Saya telah melihat solusi berikut:
ksh --version
echo ${.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}
,ksh
memperlakukan 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_VERSION
tampaknya berfungsi dengan baik - maksud saya itu tidak akan macet - meskipun pada mesin ini kosong. Juga, saya melihat di suatu tempat bahwaKSH_VERSION
hanya disetel olehpdksh
.
Pertanyaan:
- Bagaimana cara memeriksa versi
ksh
dengan aman secara terprogram? Untuk tujuan saya di sini, saya tidak terlalu peduli apa nomor versi sebenarnya, hanya apakah itu versi lama dariksh
. - Apakah
$KSH_VERSION
cukup baik? Maksud saya jika kosong, makaksh
tentu versi yang sudah ketinggalan zaman? Apakah forum lain itu benar sehingga mungkin tidak disetel bahkan untuk versiksh
yang 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_VERSION
untuk mendeteksimksh
,pdksh
,lksh
- Jika langkah pertama gagal, coba fitur yang berbeda antara
ksh93
danksh88/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