Qanday qilib men ishonch bilan ksh versiyasini olaman?

Qanday qilib xavfsiz tarzda ksh versiyasini ksh skriptidan olish mumkin?

quyidagi echimlarni ko'rmoqdaman :

  1. ksh - versiya
  2. echo $ {. sh.version}}
  3. ni bosing
  4. echo $ KSH_VERSION
  5. ni bosing

Va to'g'ri sharoitlarni hisobga olgan holda, ularning har biri to'g'ri ishlaydi. Ammo, men mukammal bo'lmagan ish haqida qayg'uraman.

Ayniqsa, men ishlaydigan bir nechta mashinalar bor, ular ksh oldingi versiyalariga ega, chunki mening maqsadlar uchun funktsional jihatdan juda kam. Yaxshiyamki, versiyani tekshirishni istaganim (dasturiy jihatdan) ksh versiyasining kamroq variantlardan biri ekanligini bilishdir; va agar shunday bo'lsa, uncha kamroq kodli filialni bajarishni istayman.

Biroq, muammoli mashinalarda, qobiqning notekisligi versiyani tekshirishga ...

  • If I try ksh --version, it prints nothing and opens a new instance of ksh!
  • If I try echo ${.sh.version}, ksh treats this as a syntax error that cannot be discarded with 2> /dev/null.

    $ echo ${.sh.version} 2> /dev/null  
    ksh: ${.sh.version}: bad substitution
    
  • Of course echo $KSH_VERSION appears to work fine – I mean it won't crash – though on these machines it's blank. Also, I saw somewhere that KSH_VERSION is set only by pdksh.

Savollar:

  • ksh dasturiy ta'minotini qanday qilib ishonch bilan tekshirish mumkin? Bu erda mening maqsadlarim uchun, haqiqiy versiya raqamining nima ekanligini bilmayman, faqat uning eski kodi ksh bo'ladimi.
  • $ KSH_VERSION etarlimi? Demak, bu bo'sh bo'lsa, unda ksh mutlaqo eskirgan versiyami? ksh ning yangi versiyalari uchun o'rnatilmasligi mumkin bo'lgan boshqa forum ham to'g'rimi?
  • Buni tekshirishning hech qanday usuli yo'qmi?
12
@ ThorbjørnRavnAndersen bu so'rov bilan bog'liq. .Kshrc faylida tcsh va zsh ko'rsatmalarining pwd-qisqartirish funktsiyalarini simulyatsiya qiladigan funksiya mavjud va bu funktsiyani ishlatish uchun PS1 ni o'rnatdim. Biroq, Old ksh PS1 da $() ni qo'llab-quvvatlamaydi. Shuning uchun kshning zamonaviy versiyasi bo'lsa, men yaratgan funktsiyani ishlatish uchun PS1 ni xohlayman; agar eski versiya bo'lsa, faqat $ PWD dan foydalaning.
qo'shib qo'ydi muallif Jimmie R. Houts, manba
Yana bir yondashuv oddiygina "Bu muammoni hal qiluvchi maxsus mashina - bu fayl yoki muhit o'zgaruvchisi yoki boshqa narsa mavjud (ehtimol AIX yoki biror narsa bor) va uni sinab ko'raylik" deb aytishi mumkin.
qo'shib qo'ydi muallif Swaroop C H, manba
Xo'sh, siz konfiguratsiya faylingizning ikkita versiyasiga ega bo'lishingiz mumkin (ehtimol, boshqasidan ishlab chiqarilgan) va keyin tegishli versiyani ushbu mashinaga tarqatasiz?
qo'shib qo'ydi muallif Swaroop C H, manba
Ikki kodli yo'lni istaysiz va bundan kamroq dahshatli kodga ega bo'lgan har qanday sabab yo'qmi?
qo'shib qo'ydi muallif Swaroop C H, manba

7 javoblar

.sh.version ATT ksh 93 ning birinchi versiyasidan beri mavjud bo'lgan deb o'ylayman. U pdksh yoki mksh ichida mavjud emas. $ {. Sh.version} , ksh93 tashqari shell'larda sintaksisi xatosi bo'lgani uchun sinovni pastki qavatda o'tkazish va uni eval orqasida himoya qilish.

_sh_version=$(eval 'echo "${.sh.version}"' 2>/dev/null) 2>/dev/null
case $_sh_version in
  '') echo "This isn't ATT ksh93";;
  …
esac

KSH_VERSION started out in the public domain ksh clone (pdksh), and was added to the actual Korn shell relatively recently, in 2008 with ksh93t.

Versiya raqamini tekshirish o'rniga, sizga qayg'uradigan maxsus xususiyatni sinashingiz kerak. Ko'pgina funktsiyalar, sub-shellda ba'zi tuzilishlarni sinab, xatolikni tekshirib ko'rish uchun tekshirilishi mumkin.

7
qo'shib qo'ydi
Kelajakdagi o'quvchilar uchun men murojaat qiladigan operatsion tizimlar Solaris 5.10, HP-UX 11 va AIX 7 bo'ladi.
qo'shib qo'ydi muallif Jimmie R. Houts, manba
Bu biroz yaxshiroq. Solaris va HP-UX da prefectly ishlaydi. AIX uchun buyruq satrida ishlaydi, lekin uni qobiq funksiyasida joylashtirmoqchi bo'lsam, yana qaddini rozetkadan boshlaydi.
qo'shib qo'ydi muallif Jimmie R. Houts, manba
Men aytayotganingizni tushunaman. Aytmoqchimanki, bu xato noto'g'ri yo'naltirilmaydi. Konsolga har doim bosib chiqaradi. Buni Solaris, AIX va HP-UX da sinab ko'rdim; va ksh bu xatti-harakatlarning barchasida namoyon bo'ladi.
qo'shib qo'ydi muallif Jimmie R. Houts, manba
Ichki makondan foydalanishda hech qanday farq yo'q. U hali ham $ {. Sh.version} bilan bog'lana olmaydigan sintaksik xato deb qaraydi. Qabul qilingan xabar bad substitution .
qo'shib qo'ydi muallif Jimmie R. Houts, manba
@ GregA.Oudlar Ouch. 2>/dev/null yoki _sh_version = $ (eval 'echo "$ {. Sh." Echo "$ {. Sh.version}" haqiqiyligini tekshiring) _sh_version = $ versiya} "> 2>/dev/null ?
qo'shib qo'ydi muallif Valters Vingolds, manba
@Sildoreth Ah. Men faqatgina Linuxda sinab ko'rdim, hozirda bu sinovlarni amalga oshirish uchun hech qanday operatsion tizim mavjud emas. eval '_sh_version = $ (echo "$ {. Sh.version}")' 2>/dev/null yaxshiroq ishlaydi?
qo'shib qo'ydi muallif Valters Vingolds, manba
@sil Agar pastki qavatni ishlatish nuqtasi xatoni qo'lga olishdir. /dev/null xatolariga yo'naltirish va chiqish holatini e'tiborsiz qoldiring.
qo'shib qo'ydi muallif Valters Vingolds, manba
Nima uchun ikkinchi 2>/dev/null ?
qo'shib qo'ydi muallif Stéphane Chazelas, manba
buyrug'i eval '_sh_version = $ {. Sh.version}' 2/dev/null yoki {_sh_version = ...; } 2>/dev/null
qo'shib qo'ydi muallif Stéphane Chazelas, manba
Afsuski, NetBSD sh-da (Linuxda dash-0.5.7-3 bo'lsa-da) shikoyat bilan $ {. Sh.version} ni ko'rganda skriptni o'qishni to'xtatib turadi. Syntax error: yomon substitution .
qo'shib qo'ydi muallif armadillotoe, manba
eval yana qutqarish uchun! Yonaltiruvchi buyruqlar kengaytmasiga o'tkazilishi kerak: _sh_version = $ (eval 'echo "$ {. Sh.version}"' 2>/dev/null) Sizga katta rahmat!
qo'shib qo'ydi muallif armadillotoe, manba
FYI, mening eval versiyasi ham ksh88e bilan ishlaydi (faqat NetBSD/amd64 ustida qurish va ishga tushirishim kerak, garchi ba'zi hasharotlar va kichik tuzatishlar bilan). Ie. _sh_version bo'sh qoldiradigan ma'noda "ishlaydi" va standart xatoga hech narsa yozilmaydi; chunki versiya va undan oldingi versiyalarining versiyani identifikatsiyalash uchun muharriri komandasidan boshqa hech qanday yo'l yo'qligini bilasiz.
qo'shib qo'ydi muallif armadillotoe, manba

KSH_VERSION was not implemented in ksh93 before version 93t. It will be set in mksh, pdksh, lksh. So for checking the version of ksh, we can try these steps:

  • Checking KSH_VERSION to detect mksh, pdksh, lksh
  • If first step fails, try a feature that's different between ksh93 and ksh88/86 (Let David Korn show us).

Bularni eslab, men bilan birga boraman:

case "$KSH_VERSION" in
  (*MIRBSD*|*PD*|*LEGACY*) printf '%s\n' "$KSH_VERSION" ;;
  (*) [ -z "$ERRNO" ] && printf '%s\n' "${.sh.version}" || echo ksh88/86 ;;
esac
6
qo'shib qo'ydi
Nima uchun $ KSH_VERSION avval bo'sh emas, bu tekshiruvni bajarmaydi? Mening Ubuntu mashinamda, bu "ksh93" ni yozadi, ammo KSH_VERSION o'rnatilgan.
qo'shib qo'ydi muallif Jimmie R. Houts, manba
Agar ENV o'zgaruvchisi o'rnatilgan bo'lsa (va odatda ~/.kshrc ga o'rnatilsa), skript albatta .kshrc faylini o'qiydi. Albatta, skriptni KSH_VERSION saxovatiga qo'yish odatiy hol bo'lib qoladi, biroq, bu birinchi satrda ko'rsatilgandan ko'ra, boshqa tarjimon bilan skriptni aniq ifodalash kabi, mumkin bo'lgan holat.
qo'shib qo'ydi muallif Eric Scrivner, manba
Agar ilgari amalga oshirilgan ba'zi bir kod (masalan, .kshrc) KSH_VERSION o'zgaruvchisini ba'zi tasodifiy qiymat bilan o'zgartirsa, bu bajarilmaydi.
qo'shib qo'ydi muallif Eric Scrivner, manba
pdksh va olingan kabuklar, albatta, KSH_VERSION o'zgarmaydigan bilan o'qiladi, lekin AT & T ksh ega emas. ksh93t (2008) dan oldingi versiyalar uni o'rnatmaydi va uni cheklashsiz o'zgarmaydigan nom sifatida qabul qilmaydi. KSH_VERSION-ga asoslangan har qanday skript, bu o'zgaruvchini oldindan eksport qilingan yoki .kshrc faylida o'rnatilsa osongina aldanib ketishi mumkin. ksh93t va bu o'zgaruvchining ishga tushirish buyrug'i yordamida o'rnatilsa, yana yangi segfault bo'lmaydi. ksh93t uchun ksh93u parametrini faqat segfault deb o'zgartiring, ularning boshlang'ich sharoitida allaqachon o'rnatilgan. Segfaulting ksh93v ga o'rnatildi.
qo'shib qo'ydi muallif Eric Scrivner, manba
@jlliagre: Yo'q, u skript sifatida ishlatilgani uchun .kshrc ni o'qimaydi.
qo'shib qo'ydi muallif cuonglm, manba
@jlliagre: Siz uni o'zgartirishingiz mumkin, siz KSH_VERSION ga murojaat qilganingizda segfault olasiz. mksh da, pdksh , lksh , KSH_VERSION , faqat o'qish sifatida belgilanadi.
qo'shib qo'ydi muallif cuonglm, manba

For "real" ksh releases (i.e. AT&T based), I use this command:

strings /bin/ksh | grep Version | tail -2 

Mana turli xil chiqimlar bor:

Original ksh:

@(#)Version M-11/16/88i

dtksh;

@(#)Version 12/28/93
Version not defined

Zamonaviy ksh93:

@(#)$Id: Version AJM 93u+ 2012-08-01 $

For pdksh/msh ksh clones and modern AT&T ksh versions too, here is something that works:

$ mksh -c 'echo $KSH_VERSION'
@(#)MIRBSD KSH R50 2015/04/19

Tahrirlash:

Men seni sinab ko'rilgan ksh ikkilikka yo'lini bilish bilan emas, balki skript ichidan qilishni so'ragan edim.

ksh versiyasini chindan ham istaganingizni inobatga olib, qo'llab-quvvatlaydigan xususiyatlar emas, balki faqatgina strings buyrug'ini ishlatishning bir usuli bu kamida Linux va Solaris:

echo $(for i in $(find /proc/$$ ! -type d ! -name "pagemap" | 
  grep -v "/path/" | grep -v "/fd/" ) ; do
  strings $i | egrep "([V]ersion|[K]SH_VERSION).*[0-9]" | sort -u
done 2>/dev/null)

Ushbu usulni /proc ga ulanmaganligi uchun ishonchsiz deb hisoblang va albatta, boshqa zaifliklar ham mavjud. Boshqa Unix operatsion tizimlarida tekshirilmagan.

5
qo'shib qo'ydi
@Gilles Oh. Men o'ylay boshladim .kshrc. Lekin siz nimani nazarda tutayotganingizni ko'raman.
qo'shib qo'ydi muallif Jimmie R. Houts, manba
@Qanday qilib, bu command -v $ 0 tomonidan qaytarilgan qiymat bo'yicha bajarilgan bo'lsa?
qo'shib qo'ydi muallif Jimmie R. Houts, manba
@kuonglm Kechirasiz, men aniq emas edim. " ksh versiyalari» uchun «yozganimda», pdksh , mksh va lksh kabi AT & .
qo'shib qo'ydi muallif Eric Scrivner, manba
@cuonglm Javobni lksh va pdksh bilan ham strings buyrug'i bilan ishlaydigan usul bilan yangiladim.
qo'shib qo'ydi muallif Eric Scrivner, manba
To'g'ri, haqiqatan ham. Tarjimon satrini ishonchli ishlatib bo'lmaydi, javob yangilanadi.
qo'shib qo'ydi muallif Eric Scrivner, manba
@cuonglm Men sinov uchun Jessie yo'q. lksh va pdksh degan ma'noni anglatadimi KSH_VERSION dan ajratish mumkin emasmi?
qo'shib qo'ydi muallif Eric Scrivner, manba
Ba'zi ksh ikkiliklarda satrlari ishlatish noto'g'ri fikrdir, chunki siz bu skriptni bajarayotgan narsa emasligini bilmay qolasiz. Ehtimol skriptingiz /usr/local/bin/ksh yoki /home/bob/bin/ksh yoki /bin/sh yoki /usr/posix/bin/sh yoki ...
qo'shib qo'ydi muallif Valters Vingolds, manba
@Sildoreth bu erda $ 0 qanday foydali? Tarjimonga emas, balki skriptni belgilaydi.
qo'shib qo'ydi muallif Valters Vingolds, manba
Bir muncha vaqt ishlatilgan strings ni ko'rmadim. Bu yaxshi dastur. Menga eslatganingiz uchun tashakkur!
qo'shib qo'ydi muallif SailorCire, manba
Bu Debian Jessi-da lksh va pdksh o'rtasida farq bo'lmaydi.
qo'shib qo'ydi muallif cuonglm, manba
@jlliagre: Agar kod ksh skript yoki lksh skript yoki pdksh skript deb nomlangan bo'lsa, sizning yechimingiz muvaffaqiyatsiz tugadi.
qo'shib qo'ydi muallif cuonglm, manba
Yo'q, ularni satrlari ga ishlating. KSH_VERSION aniq bilishi mumkin.
qo'shib qo'ydi muallif cuonglm, manba

ksh uchun skript yozishda men ksh ning -sadan buyrug'i -a ni qo'llab-quvvatlamaydi eski kodlari ksh . Bu men tekshirgan barcha tizimlarda, ya'ni Solaris, AIX, HP-UX va Linuxni o'z ichiga olgan ko'rinadi.

Shuning uchun ksh funktsiyasi sifatida yechim bor:

is_modern_ksh() {
  if whence -a whence > /dev/null 2>&1 ; then
    return 0 #success -> true
  fi
  #Else the call to `whence` failed because `-a` is not supported
  return 1 #failure -> false
}

Va buni qanday ishlatish kerak:

if is_modern_ksh ; then
  echo "You're using a MODERN version of ksh. :)"
else
  echo "You're using an OLD version of ksh. :("
fi
2
qo'shib qo'ydi
@MichaelBrux Barcha nuqta xatolarni qayta yo'naltirishni keyinroq sarflaydigan eski versiyalar uchun tashlanadigan xatolikdir. Bu funksiya ksh versiyasini "eski" deb belgilaydi. Siz xatolarni qayta yo'naltirish ishlamayapsizmi?
qo'shib qo'ydi muallif Jimmie R. Houts, manba
@Greg Yoki zsh ning ba'zi funktsiyalari uchun ksh-ga qo'ng'iroq qilishni anglatadimi? Agar shunday bo'lsa, bu funktsiyaga hatto kerakligidan shubhalanaman. Bu kabi funktsiyaga muhtojligimning asosiy sababi kshning eski versiyalarida ma'lum funktsiyalarning etishmasligi haqida qachon ishlash kerakligini bilish zaruriyati edi. Siz uchun zshga qon ketadigan eski ksh versiyalarining muayyan kamchiliklari bormi? Agar shunday bo'lsa, men zshning asosiy printsipi bu barcha kamchiliklarni bartaraf qilishda boshqa barcha kabuklardan eng yaxshisini birlashtirganidan ajablanaman.
qo'shib qo'ydi muallif Jimmie R. Houts, manba
@Greg "zsh" kshni ishga tushirish uchun ramziy aloqa sifatida belgilanasizmi? Agar shunday bo'lsa, unda siz zsh ishlamayapsiz. Agar kshning bu versiyasi -a ni qo'llab-quvvatlasa, bu albatta ksh ning zamonaviy versiyasidir; va is_modern_ksh funktsiyasi faqat o'z ishini bajaradi.
qo'shib qo'ydi muallif Jimmie R. Houts, manba
@ GregA.Woods, bu funksiya ksh uchun maxsus. Funktsiyaning ta'rifi .kshrc ga kiradi va shuning uchun zsh kabi boshqa kabuklar uchun ham mavjud bo'lmaydi. zsh ning ksh yoki uning versiyasiga hech qanday aloqasi bo'lmagan qaerdan buyrug'i mavjud. Men kshni butunlay boshqacha qobiq bo'lgan zsh misolidan oldingi versiyani tekshirish uchun nima uchun kerakligini bilmayman.
qo'shib qo'ydi muallif Jimmie R. Houts, manba
@quyonlm, chunki qila olmayman. Gillesning javobiga javoblarni ko'ring.
qo'shib qo'ydi muallif Jimmie R. Houts, manba
Mksh bilan ishlamaydi: mksh: qaerdan: -a: noma'lum variant . KSH_VERSION quyidagicha: @ (#) MIRBSD KSH R54 2016/11/11 (Debian 9/strech)
qo'shib qo'ydi muallif drxzcl, manba
@Sildoreth: "mksh pdkshning vorisdoshi" - bu mening tushunchamdan, u zamonaviydir. Sizning kodingiz "OLD versiyasi" ni qaytaradi, men xato nuqtai nazaridan qaytib kelaman. Ushbu xato sababi shuki, mksha qaerdan joylashgan bo'lsa-ni tanlamaydi. Bu aniqroq/tushunarli/to'g'rimi?
qo'shib qo'ydi muallif drxzcl, manba
Yo'q, Zsh, Ksh bo'lishni xohlaydi, garchi ba'zi holatlarda eng so'nggi versiyalar bu qadar yomon bo'lgan.
qo'shib qo'ydi muallif armadillotoe, manba
Sizning varsayımlarınızla bog'liq bir muammo bor: Zsh tez-tez /bin/ksh ga bog'langan, masalan. Debian Linux-da. Endi u erda foydalanmayapman (va hozir men tekshirish uchun kirish kabuğunu o'zgartira olmayman), shuning uchun u .kshrc o'qib chiqmaganligini bilmayman, lekin gumon qilaman u shunday qiladi.
qo'shib qo'ydi muallif armadillotoe, manba
Afsuski, Zsh ning qaerdan kelishi -a
qo'shib qo'ydi muallif armadillotoe, manba
Nima uchun $ {. Sh.version} foydalanmaysiz?
qo'shib qo'ydi muallif cuonglm, manba

CTRL+ALT+V

yoki

ESC , CTRL+V

Odatda, siz foydalanadigan KSH versiyasini interaktiv ravishda aniqlashga nisbatan juda ishonchli ekanligi aniqlandi, biroq ularni skriptga kiritish qiyinroq.

1
qo'shib qo'ydi
Bu faqat AIX ksh-88f versiyasida ishlagan.
qo'shib qo'ydi muallif javanix, manba
Kodni o'rnatish uchun ESC , CTRL + V ni tanladim, keyin set -o vi keybindings vi kabi. Bundan oldin, yoki u yoki u bilan yoki-emacs bilan, u menga ko'rsatmasdi. PD KSH v5.2.14 99/07/13.2 OpenBSD haqida 6.1
qo'shib qo'ydi muallif Meitar, manba

Quyidagilar men sinab ko'rgan barcha kabuklar uchun juda yaxshi ishlaydi, jumladan, eski ksh88e va umumiy Ksh klonlarining deyarli to'liq miqdori (har birining bir nusxasi bo'lsa ham), aslida haqiqiy Bourne shell ( va buni amalga oshirish eski kodlar uchun test ifodasini moslashtirishni talab qilishi mumkin.

Qo'shimchalar:

Heirloom Bourne Shell bilan sinovdan o'tdik, lekin tashqi (va undan zamonaviy) test dasturida.

is_attksh()
{
    # ksh93
    _sh_version=$(eval 'echo "${.sh.version}"' 2>/dev/null)
    # pdksh only
    _opt_login=$(set -o | grep login)

    test -n "${_sh_version}" -o \( -z "${_opt_login}" -a -n "${_}" -a -n "${ERRNO}" -a -n "${FCEDIT}" -a -n "${PS3}" \)
}
is_attksh && echo "AT&T Ksh${_sh_version:+: }${_sh_version:- (probably ksh88 or ksh86)}" || echo "not real ksh"

is_zsh()
{
    test -n "${ZSH_VERSION}"
}
is_zsh && echo "Zsh: ${ZSH_VERSION}" || echo "not zsh"
0
qo'shib qo'ydi
Bu sizning qayerdan kelganingizni yoritadi. Biroq, bu aniq bo'lmagan talabga o'xshaydi. Odatda, Unix ishlab chiquvchisi "ko'chma" deb aytsa, ular "bu kod har qanday qobiqda ishlaydi" degani emas, ular "bu har qanday tizimda ishlay boshlaydi" . Va agar siz yana bir qobiq uchun yozilgan buyruqni bajarishingiz kerak bo'lsa, bu juda yaxshi qonuniy; faqat skriptingizda boshqa shellning interaktiv bo'lmagan bir misolini boshlang. Yaxshi kodlash amaliyotlarini targ'ib qilishni istaganim uchun buni keltiraman. Agar bu yechim sizga yoqsa, ajoyib. Lekin men boshqalarga oddiyroq yondoshishni maslahat beraman.
qo'shib qo'ydi muallif Jimmie R. Houts, manba
Nima uchun bu funktsiyani ksh bo'lmagan kabuklar uchun ishlatmoqchisiz? Agar bash yoki zsh da skriptni ishlatsangiz, ksh hech qachon o'yinga kirmaydi. Bundan tashqari, boshqalarning javoblari orqali, ya'ni $ {. Sh.version} echimning bir qismi bo'lishi mumkin emas, chunki kshning muayyan versiyalari - dastlabki xabarni qiziqtirgan versiyalar - bu sintaksisi.
qo'shib qo'ydi muallif Jimmie R. Houts, manba
E'tirof etish joizki, orqaga qarama-qarshilikni o'tmishga nisbatan tezroq surish uchun qilingan har qanday sa'y-harakatlar juda achinarli. Men faqat ba'zi xususiyatlarning tarixini va evolutsiyasini yaxshiroq tushunishga va o'zimning narsalarimni (odatda ko'p narsalar odatdagiday meni hayratda qoldiradigan) xotiramni yangilashga bo'lgan shaxsiy xohishimni qondirish uchun qadimgi AT & T Ksh va Unix Sh versiyalarini tuzdim. yaxshiroq "deb hisoblayman, lekin ba'zan ular ham yomonroq edi).
qo'shib qo'ydi muallif armadillotoe, manba
O'tgan 28 yil davomida har qanday Bourne (va keyinchalik POSIX) muvofiq /ming/sh bilan ishlash uchun mo'ljallangan ko'chma qobiq skriptlarini yozyapman. :-)
qo'shib qo'ydi muallif armadillotoe, manba
Men yozgan skriptlar portativ bo'lishi va har qanday qobiliyatli qobiq tomonidan boshqarilishi uchun mo'ljallangan. Bundan tashqari, boshqa joylarda ham aytganimdek, ayrim kishilar Zshni Ksh sifatida ishlatayotganligini bilishmaydi, chunki ular "ksh" ni yozganda Zsh ikkilik (argv [0] bilan "ksh" deb chaqiriladi).
qo'shib qo'ydi muallif armadillotoe, manba
Aytganimdek, men ko'rsatadigan vazifani "o'lik" xatolar bilan bir qatorda Ashning versiyalarini beradigan "ksh" versiyalari bilan sinab ko'rdik.
qo'shib qo'ydi muallif armadillotoe, manba

$ {Sh.version} dan foydalanishda asosiy muammo shundaki, ksh88 faqat nol bo'lmagan chiqish kodi bilan to'xtaydi.

Shunday qilib, mening qarorim $ {. Sh.version} ga murojaat qiladigan kodni pastki qobiqga havola etish, so'ngra pastki qobiq noldan chiqmaganligini tekshirib ko'rish va sinov versiyalarida ishlaydigan pastki qobiqda kod borligini tekshirish. $ {. sh.version} ga murojaat qiladigan ksh ishlaydi. Keyinchalik, haqiqiy qo'ng'iroqni tekshirish uchun, qaytarish kodini qaytaradigan boshqa funktsiya tomonidan chaqiriladigan funksiyaga aylantiriladi.

function is_oldksh
{
    (test -n ${.sh.version}) 2>/dev/null
}

function oldkshtest
{

    is_oldksh || return 0 && return 1
}

oldkshtest && echo "old ksh" || echo "new ksh"

I have run this on AIX and Oracle Enterprise Linux 5 & 6, with ksh88, ksh93 and pdksh.

Pete

0
qo'shib qo'ydi
hozirgi AT & T Ksh hali ham .sh.version (aslida KSH_VERSION ) uchun yana bir taxallusni taqdim etadi. Bundan tashqari, ba'zi kabuklar, masalan. NetBSD sh, oddiygina $ {. Sh.version} duch kelganidan keyin o'qishni to'xtatadi va qayta yo'naltirish miqdori ularni skriptni ishlatishlariga xalaqit berolmaydi.
qo'shib qo'ydi muallif armadillotoe, manba