ã¯ããã«
ãã®èšäºã¯ç§ã®äž»èгãã€ç¥ã£ãŠããããšããŸãšãããã®ã§ããå€ãããã®ã·ã§ã«ã®å°éå®¶ãšãã§ã¯ãªãããæ°å¹Žã®éã«å¿ èŠã«ãªã£ãæã«ãã®éœåºŠèª¿ã¹ããã®ãªã®ã§ééããšãããããšæããŸãããŸãã¿ã€ãã«ã®éãã¹ã¯ãªããèšèªãšããŠã®æ¯èŒã§ããã€ãŸãã€ã³ã¿ã©ã¯ãã£ãã·ã§ã«ã®æ©èœã«ã€ããŠã®æ¯èŒã¯ããŠããŸãããïŒãããã䜿ã蟌ãã§ããããããªãã®ã§ç¥ããªãã§ããïŒPOSIX ã·ã§ã«ã«éå®ããŠããã®ãç§ãä»ã®ã·ã§ã«ã詳ããç¥ããªãããã§ããããä»ã䜿ãããŠããŠïŒãããã¯éçºäžã§ïŒããã«æžãããŠããªã POSIX ã·ã§ã«ããããŸãããã³ã¡ã³ãã§æããŠäžãããïŒâ» csh, tcsh, fish 㯠POSIX ã·ã§ã«ã§ã¯ãããŸãããïŒ
ã·ã§ã«ã®ç³»çµ±ã¯å°ãå€ãã§ãããWhat does it mean to be âsh compatibleâ?ãã«æçš¿ãããŠããå³ã詳ãããŠããããããã§ãããŸããã¡ãã~sven_mascheck/ãã§ãå€ãã®ã·ã§ã«ã®çްããäºçš®ïŒvariants) ã«ã€ããŠãŸãšããããŠããŸãã
è¿œèš ãªãããã®èšäºãçµæ§èŠãããŠãããããªã®ã§å®£äŒ
ãªãããã ãã® POSIX ã·ã§ã«ã調ã¹ãããšèšããšãç§ãéçºããŠãã ShellSpec ãšããã·ã§ã«ã¹ã¯ãªããçšã®ãã¹ãã£ã³ã°ãã¬ãŒã ã¯ãŒã¯ã¯ãæ¬åœã«ãã¹ãŠã® POSIX æºæ ã·ã§ã«ã«å¯Ÿå¿ããŠãããšèšããããã«ããããã§ããæåŸã®ããã®ä»ãã«æžãã POSIX ã«ãŸã æºæ ããŠãªãã·ã§ã«ãã®ãããŠå®éã« ShellSpec èªèº«ã®ãã¹ããå®è¡ããŠåäœç¢ºèªããŠããŸããã©ããåãã ãã§æ©èœãå°ãªãããå®çŸã§ããŠããã§ããïŒãšæã£ãããªããShellSpec ã¯åãã ããããããŸãããåœåãã RSpec ã®ã·ã§ã«ã¹ã¯ãªããçãç®æšãšããŠããããã§ã«ä»ã®ã·ã§ã«ã¹ã¯ãªããçšãã¹ãã£ã³ã°ãã¬ãŒã ã¯ãŒã¯ã®æ©èœã倧ããäžåã£ãŠãããšèªè² ããŠãããŸããïŒåè Bash test framework comparison 2020 - Dávid Csákváriããã«ããæ¯èŒèšäºã»ã»ã»ã«æžãããŠãªãæ©èœãããããïŒã€ã³ã¹ããŒã«ããã«ãã©ãŠã¶äžã§å®è¡ã§ãããã¢ãçšæããŠããŸãã®ã§èå³ãããæ¹ã¯ãã²äœ¿ã£ãŠã¿ãŠãã ãããïŒStar ãã€ããšåã³ãŸããïŒ
ç¬èªç³»çµ±
â bash - Bourne Again SHell
1989幎ã«åçãªãªãŒã¹ã/bin/sh ããŠãŒã¶ãŒçšã®ïŒã€ã³ã¿ã©ã¯ãã£ãïŒã·ã§ã«ãšããŠåºã䜿ãããŠãããé
åãªã©ããã°ã©ãã³ã°ãè¡ãäžã§äŸ¿å©ãªæ¡åŒµæ©èœãå®è£
ããŠããããããã¯ïŒãã°ãã°æªãæå³ã§ïŒbashism ãšåŒã°ããŠãããå€ã㯠ksh ããã®ç§»æ€ã§ãããããŒãžã§ã³çªå·ã¯ $BASH_VERSION 倿°ã«ãŠååŸãå¯èœã
CentOS ã macOS ã® /bin/sh ã®å®äœã¯ bash ã§ãããmacOSã® bash ã¯ææ°ïŒçŸæç¹ã§ CatalinaïŒã§ãã£ãŠã ããŒãžã§ã³ 3.2.57 ãšå€ãã®ã§æ³šæïŒã©ã€ã»ã³ã¹äžã®çç±ãšèšãããŠãããïŒ/bin/sh ãšããŠå®è¡ããå Žå㯠POSIX äºæã¢ãŒããšãªããããŠãŒã¶ãŒã·ã§ã«ãšã㊠bash ã䜿çšããŠããå Žåãšã¯å€å°åããç°ãªããããã« macOS ã§ã¯å°ãæ¹å€ãããŠããããã echo -n ã§-nããã®ãŸãŸåºåããããšãã£ãéããããã
äºææ§äžã®æ³šæç¹
ã»ã¹ã¯ãªããã§ alias ã䜿ãå Žå㯠expand_aliases ãæå¹ã«ããå¿
èŠããã
shopt -s expand_aliases
ã»macOS ã§ /bin/sh ãšããŠäœ¿ãå Žå POSIXLY_CORRECT ã unset ããªããš echo -n ã§ -n ããã®ãŸãŸåºåãããã
$ /bin/sh
$ echo -n foo
-n foo
$ unset POSIXLY_CORRECT
$ echo foo
foo
â zsh - Z shell
1990幎ã«åçãªãªãŒã¹ãbash ã®äžäœäºæçãªååšã ãããã©ã«ãèšå®ã§ã¯ POSIX ãšã¯ç°ãªããšãããå€ãã®ã§æ³šæãå¿
èŠãmacOS Catalina ã§ãŠãŒã¶ãŒã®ããã©ã«ãã·ã§ã«ãšãªã£ããïŒãã ã /bin/sh 㯠以åãšå€ããã bash ã§ãããïŒbash / ksh ã ãã§ãªã csh ã®æ©èœãŸã§åã蟌ãã§ããããããå°æ°ã®èšç®ãå¯èœãPOSIX ã·ã§ã«ã®äžã§æã髿©èœãããŒãžã§ã³çªå·ã¯ $ZSH_VERSION 倿°ã«ãŠååŸãå¯èœã
äºææ§äžã®æ³šæç¹
ã»POSIX æšæºã®æ¹æ³ã§å€æ°ã®åèªåå²ãè¡ãå Žå㯠shwordsplit ãæå¹ã«ããã
chars="a b c"
printf '%s\n' $chars # => a b c <LF> # ä»ã®ã·ã§ã«ãšåå²ã®ä»æ¹ãç°ãªã
setopt shwordsplit # ä»ã®ã·ã§ã«ãšåãåãã«ãªã
printf '%s\n' $chars # => a<LF>b<LF>c<LF>
# ${=var} ã䜿çšããã° shwordsplit ãæå¹ã«ããªããŠãä»ã®ã·ã§ã«ãšåãåãã«ãªãã
# ${=var} èªäœã POSIX æºæ ã§ã¯ãªããã·ã§ã«ã«ãã£ãŠã¯æ§æãšã©ãŒãšãªãå Žåããã
printf '%s\n' ${=chars}
ã»é¢æ°ã®äžã§ $0 ãã·ã§ã«ã¹ã¯ãªããåã§ã¯ãªã颿°åãšãªãã
echo "$0" # => test.sh
foo() {
echo "$0" #=> foo
}
foo
ã»é
åã®ã€ã³ããã¯ã¹ã 1 ãããïŒããããé
å㯠POSIX æºæ ã§ã¯ãªãããïŒsetopt ksharrays ã䜿ãããšã§ bash ã ksh ãšåãã 0 ããå§ããããšãåºæ¥ãã
array=(a b c)
echo "${array[1]}" # => a
setopt ksharrays
echo "${array[0]}" # => a
ã»status ã path ãç¹æ®å€æ°ãäžæçãªå€æ°åãšããŠäœ¿ããã¡ãªã®ã§æ³šæãããã« path 㯠PATH ãšçŽä»ããŠãããã path=""ãªã©ãšãããšå€éšã³ãã³ããå®è¡ã§ããªããªã£ãŠãããã®ã§ããã«æ³šæã
ã»ä»å€æ°ãemulate -R sh ãå®è¡ãããš POSIX äºæã®èšå®ã«ãªããïŒemulate -R ksh ã emulate -R csh ãªã©ãããïŒ
â yash - yet another shell
2008幎ã«åçãªãªãŒã¹ãPOSIX ã«æºæ ããŠãããæ¡åŒµæ©èœãå®è£
ããŠãããå°æ°ã®èšç®ãè¡ãããéçºè
ãæ¥æ¬äººãªã®ãããå
¬åŒã®æ¥æ¬èªããã¥ã¡ã³ããçšæãããŠããã®ã§ã·ã§ã«ã®ææ³ãªã©å匷ããã«ã¯äŸ¿å©ãããããªããbash ã zsh ããã POSIX ã«å³å¯ã«æºæ ããŠãããããå®é倧ããªåé¡ãã§ãèšæ¶ããªããããŒãžã§ã³çªå·ã¯ $YASH_VERSION ããååŸå¯èœã
äºææ§äžã®æ³šæç¹
LANG ã UTF-8 ã§ãªãç¶æ
ã§ UTF-8 æååãå«ãŸããã¹ã¯ãªãããå®è¡ãããšãšã©ãŒã«ãªããæåãå³å¯ã«æ±ã£ãŠããããã§åäœãšããŠã¯åé¡ãªãã®ã ããä»ã®ã·ã§ã«ã§ã¯ããã¯ãªããªãã®ã§æ³šæãå¿
èŠã
â bosh - Schily Bourne Shell
Schily Tools ãããžã§ã¯ãã§æäŸãããŠããããŒã«ã®äžã€ãšããŠã·ã§ã«ïŒboshïŒãæäŸãããŠãããOpenSolaris ã® Bourne Shell ãããŒã¹ã«ãã°ä¿®æ£ã POSIX æºæ 察å¿ãè¡ã£ãŠããããããã·ã§ã«ã¯2008幎3æé ãããœãŒã¹ã³ãŒãã«å«ãŸããŠããæ¯èŒçæ°ããã·ã§ã«ãããã±ãŒãžãšããŠæäŸãããã®ã¯ç§ãç¥ãéã NetBSD ãš OpenBSD ã®ããŒãžã§ã³ 2018-10-30 ãæåãã³ã³ãã€ã«ããã° Linux ã§ã䜿ããã
POSIX æºæ ãéèŠããŠããæ¡åŒµæ©èœã¯ååãšããŠåãå
¥ããŠããªããéçºã¯æŽ»çºã§ã·ã§ã«ã ãã®æŽæ°ã§ã¯ãªããæ1åçšåºŠãªãªãŒã¹ãããŠããã现ãããã°ããŸã æ®ã£ãŠãããããããªãã察å¿ãæ©ããç§ãå ±åããããã€ãã®ãã°ãããã«ä¿®æ£ããããbosh ã®ä»ã«æäœéã® POSIX æºæ å®è£
ã§ãã pbosh ãš POSIX 以åã® obosh (OpenSolaris Bourne Shell)ãæäŸãããŠãããããŒãžã§ã³çªå·ã¯ ${.sh.version} ããååŸå¯èœ
äºææ§äžã®æ³šæç¹
ç¹ã«å€§ããªåé¡ã¯ãªã
â osh (oil)
POSIX ã·ã§ã«ïŒæ£ç¢ºã«ã¯ bashïŒãšäºææ§ããã osh ã·ã§ã« ãš ããè¯ãã·ã§ã«ã§ãã oil ã·ã§ã«ã®2ã€ã®ã·ã§ã«ãå®è£ ããŠããããŸã éçºäžã§ã¯ããã osh ã¯ããªãã®éšåãå®è£ ãããŠããïŒ2021-01-23æç¹ ã® masterã¯ïŒPOSIX ã·ã§ã«ãšããŠã¯ååãªã¬ãã«ã«éããŠããïŒãšç§ã¯å€æããŠããïŒãæ¢åã® POSIX ã·ã§ã«ã«ããã·ã§ã«ã¹ã¯ãªãããšããŠã®èšèªäžã®åé¡ç¹ïŒééããããçœ ïŒãæ€åºããããã®æ©èœãå€ãåããŠãããbash ãã oshãosh ãã oil ãžã®ç§»è¡ãã¹ãæäŸããããšã§ã·ã§ã«ãé²åãããããšããŠããéåžžã«è峿·±ãéå¿çãªãããžã§ã¯ããéçºã¯æŽ»çºãçŸç¶ã¯ããªãé ãã®ãé£ç¹ã ãèšèªãšããŠå®æãããã®ãåœé¢ã®ç®æšã«èŠããã
ãªãååã§ãosh - Port of the Sixth Edition UNIX shellããšããBourne ã·ã§ã«ïŒPOSIX 以åïŒãããã®ã§ãã¡ããšæ··åããªãããæ³šæã
äºææ§äžã®æ³šæç¹
ããã©ã«ãã§ä»ã®ã·ã§ã«ãããå€ãã®ç¶æ
ããšã©ãŒã»èŠåãšããŠå ±åããããããã« shopt -s strict:all ã setopt -s simple_* ãæå¹ã«ããããšã§ãã峿 Œãªã¢ãŒãã«èšå®ã§ããããã ãå
šãŠã®ãªãã·ã§ã³ãæå¹ã«ãããšå³æ Œãããããæ¢åã®ã³ãŒãã®å€ãã¯ãã®ãŸãŸã§ã¯åããªããšæããããäºææ§ãšããŠã¯æ³šæç¹ã«ãããããéçºè
ãå®çŸ©ããæªãã³ãŒãã£ã³ã°ãã¿ãŒã³ãé²ãããã§ããæ¬ ç¹ãšããããã§ã¯ãªãã
Almquist shell ç³»
ããã®ãŸãšãã詳ãããhttps://www.in-ulm.de/~mascheck/various/ash/
â ash - Almquist shell
åè ãããããªãªãžãã«ã¯ POSIX ã«æºæ ããŠãªãã¯ãã§ãã
1989幎㫠Kenneth Almquist ã«ãã£ãŠäœæããã ash ç³»ã®å§ç¥ãæ¬å®¶ïŒã©ãïŒïŒã¯ã¡ã³ããã³ã¹ãããŠãªãããã®äºçš®ãåºã䜿ãããŠãããã€ã³ã¿ã©ã¯ãã£ãã·ã§ã«ãšããŠã®æ©èœã¯å°ãªããïŒash ã®äºçš®ã¯ïŒPOSIX æºæ ã§é«éã§ãããã /bin/sh ã®å®äœãšããŠæ¡çšãããŠããããšãå€ããããŒãžã§ã³çªå·ã¯ $SHELLVERS ã§ååŸã§ãããããã
äºææ§äžã®æ³šæç¹
å€ãããŠäœ¿ã£ãŠãªãã®ã§äžæ
â NetBSD sh
1993幎é ã« /bin/sh ãšã㊠ash ãæ¡çšããã®åŸ NetBSD ãã¡ã³ããã³ã¹ãããŠããããããããŒãžã§ã³çªå·ã¯ $NETBSD_SHELL ã§ååŸå¯èœ
äºææ§äžã®æ³šæç¹
ã»POSIX ã§èŠå®ãããŠãã cd ã³ãã³ã ã® -L ãªãã·ã§ã³ãå®è£
ãããŠããªããïŒNetBSD 9.0 ã§ç¢ºèªïŒ
â FreeBSD sh
1996幎é ã« /bin/sh ãšã㊠ash ãæ¡çšããã®åŸ FreeBSD ãã¡ã³ããã³ã¹ãããŠããããããããŒãžã§ã³çªå·ãååŸããæ¹æ³ã¯ãªãã
äºææ§äžã®æ³šæç¹
ç¹ã«å€§ããªåé¡ã¯ãªã
â dash - Debian Almquist shell
1997幎é ã« Herbert Xu ã«ãã£ãŠ NetBSD sh ãã Debian åãã«ç§»æ€ãã 2002幎㫠dash (Debian Almquist shell) ãšååãå€ãã£ãããã®åŸ Ubuntu 6.10ïŒ2006幎ïŒãDebian 6 (2011幎ïŒä»¥éã® /bin/sh ãšããŠæ¡çšãããããšã«ãªããããŒãžã§ã³çªå·ãååŸããæ¹æ³ã¯ãªãã
äºææ§äžã®æ³šæç¹
ã»LINENO ã¯å®è£
ãããŠããã Debian / Ubuntu ã§ã¯äºææ§äžã®çç±ã§ç¡å¹ã«ãªã£ãŠãããïŒCygwinãªã©ã§ã¯äœ¿ãããïŒ
â busybox ash
BusyBox 㯠䞻ã«çµã¿èŸŒã¿åãã«ãµã€ãºã®å°ããª1ã€ã®ãã€ããªã«ãã䜿ãã³ãã³ãã®ãµãã»ãããè©°ã蟌ãã ãã®ããã®äžã®äžã€ãšã㊠2001 幎é ã« dash ãçµã¿èŸŒãŸãã以é BusyBox ãã¡ã³ããã³ã¹ããŠãããBusyBox ãããžã§ã¯ãèªäœãããã§ããããPOSIX æºæ ãããä»ã®ã·ã§ã«ïŒãŸãã¯åã³ãã³ãïŒã®è»œéãªä»£æ¿å®è£
ãç®çãšããŠããã®ã§ã[[ ... ]] ã ${parameter//pattern/string} ãšãã£ã bash ã®ãã䜿ãããæ¡åŒµãäžéšå®è£
ãããŠãããBusyBoxã®åã³ãã³ãã¯å¿
èŠæå°éã®å®è£
ã ããashã«éã£ãŠèšãã°ãashã®äºçš®ã®äžã§æã髿©èœãããããªããããŒãžã§ã³çªå·ãååŸããæ¹æ³ã¯ãªããïŒãã ã ash ãå«ãåã³ãã³ãã® --help ãªãã·ã§ã³ã®åºåã«ããŒãžã§ã³çªå·ãå«ãŸããŠããïŒ
äœè«ã ã BusyBox ã«ã¯ Windowsãžã®ãã€ãã£ãç§»æ€çã§ãã busybox-w32 ãååšããã1 å®è¡ãã¡ã€ã«ã«ã·ã§ã«ä»¥å€ã®åã³ãã³ããå«ãŸããŠããããããã¯ãã«ãã€ã³ã³ãã³ãã®ããã«ã·ã§ã«ã¹ã¯ãªããã®äžããå®è¡å¯èœãªãããã¯ãã¹ãã©ãããã©ãŒã ã®ã¹ã¯ãªãããäœæããã®ã«ã¯äŸ¿å©ãããïŒãã ãæ¥æ¬èªæåãUnicodeã®æ±ãã¯é£ãã #61 #174ïŒ
äºææ§äžã®æ³šæç¹
ã»[[ ... ]] ã®åãã bashãšéã
[[ ... ]] ã¯ä»æ§çã«ãã«ãã€ã³ã§ãªããšå®å
šã«å®è£
ã§ããªãã¯ãã ãå€éšã³ãã³ããšããŠå®è£
ãããŠããããæåãéããå°æ¥ã¯ä¿®æ£ãããã®ãããããªãã
v="a b c"
[[ $v = "a b c" ]] # sh: b: unknown operand
[[ "$v" =~ "a b c" ]] # sh: =~ unknown operand
â GWSH
æè¿ç¥ã£ãã®ã§ããç¥ããªããåé¡ãªãåäœããŠãããIssue ã Pull Request ãåãä»ããŠãªãã®ã«ãªããããªã« contributors ãå€ããã ãããšæã£ãŠéå»ã®ã³ããããèŠãŠã¿ãã 2016幎é ã® dash 0.5.9.1 ããã®ãã©ãŒã¯ã ã£ããcontributors ã®å€§åã¯ãã©ãŒã¯ä»¥åã®ãã®ããã®åŸ2018幎9æã«ååã倿ŽããŠéçºãç¶ããããŠãã
äºææ§äžã®æ³šæç¹
ç¹ã«å€§ããªåé¡ã¯ãªã
KornShell ç³»
â ksh88
AT&T ãéçºãã POSIX ã·ã§ã«ã®å§ç¥ãksh88 ãå
ã« POSIX ã·ã§ã«ã®ä»æ§ãäœãããŠããããªãŒãã³ãœãŒã¹ã§ã¯ãªããSolaris 10 ã® /usr/bin/kshãSolaris 11 ã® /usr/sunos/bin/ksh ã ksh88 ã§ãããããŒãžã§ã³çªå·ã¯ set -o emacs ããããš Ctrl-V ãŸã㯠ESC-V ã§ç»é¢äžã«è¡šç€ºããããïŒãã®æååã¯å€æ°ã«ãã£ããã£ã§ããªããã ãããïŒ /bin/sh ã strings ã³ãã³ã + grep ã³ãã³ãçã§ååŸå¯èœãªã®ã¯ç¥ã£ãŠãããéãæ¹æ³ã欲ããïŒ
äºææ§äžã®æ³šæç¹
ã»alias ãå®è£
ãããŠããªãã
ã»set -u ããç¶æ
ã§äœçœ®ãã©ã¡ãŒã¿ãŒããªããšãã«ã"$@"ãåç
§ãããšãšã©ãŒã«ãªããpdksh ã posh ã§ãåæ§ã®ãã°ãæããå°å³ã«å¯Ÿå¿ãé¢åã
set -u --
echo "$@" # => ksh: parameter not set
# æåãªã¯ãŒã¯ã¢ã©ãŠã³ã https://www.in-ulm.de/~mascheck/various/bourne_args/
echo ${1+"$@"} # ãã ã zsh 3.1.9 ãããã§æåŸ
ããã©ããã«åããªã
eval echo ${1+'"$@"'} # äžèšã®åé¡ã«å¯Ÿå¿ããã¯ãŒã¯ã¢ã©ãŠã³ã
â ksh93
POSIX ã·ã§ã«ã®å§ç¥ã®çŽç³»ãããŒãžã§ã³ 93q ãããªãŒãã³ãœãŒã¹åããããé
ããµãã·ã§ã«ãæé©åããŠãããæ¡ä»¶æ¬¡ç¬¬ã§åããã»ã¹ãçæããªãããå Žåã«ãã£ãŠã¯ä»ã®ã·ã§ã«ãããé«éåããããšãããããã ããã®æé©ååŠçãåå ïŒïŒïŒã§ã¡ã¿ããã°ã©ãã³ã°çãªããšããããšäžå¯æè°ãªãã°ïŒææª Segmentation fault ãªã©ïŒããã³ãã³çºçãããAT&T Software TechnologyïŒASTïŒ ã®äžéšãšããŠæäŸãããŠãããæçµããŒãžã§ã³ã¯ 93u+ (2012幎)ãããŒã¿çãšã㊠93v- (2014幎ãå£ããããŠããŠä¿®æ£ã§ããªããšããæèŠãããã¬ãã«)ãããŒãžã§ã³çªå·ã¯ ${.sh.version} ã§ååŸå¯èœãïŒ93u+ 㯠$KSH_VERSION ã§ãååŸå¯èœïŒ
2021-01-19远èš
https://github.com/ksh93/ksh ã§ AT&TæçµçïŒ93u+ 2012-08-01ïŒãå ã«ãã°ä¿®æ£ã®ã¿ãè¡ã£ã 93u+m ãéçºäžãïŒãã¡ãã§ã¯ ksh2020 ã®éçºã¯å€±æãšã¿ãªããŠãããïŒ
äºææ§äžã®æ³šæç¹
ã»ãµãã·ã§ã«å ã§é¢æ°ãåå®çŸ©ããŠãããããã¬ãã«ã®é¢æ°ãåŒã³åºããããïŒ2021-01-19è¿œèš 93u+m ã§ä¿®æ£ãããŠãããïŒ
foo() { echo foo; }
(
foo() { echo FOO; }
foo # => foo
)
# 颿°åãçŽæ¥æžããã«éæ¥çã«åç
§ããã°OKãeval ã 倿°ã«å
¥ãããªã©
bar() { echo bar; }
(
bar() { echo BAR; }
eval "bar" # => BAR
)
# aliasã䜿ã£ãã¯ãŒã¯ã¢ã©ãŠã³ãïŒaliasã§éæ¥çãªåŒã³åºããè¡ãå¥é¢æ°ã«çœ®ãæããŠããïŒ
alias baz="invoke baz"
invoke() { "$@"; }
baz() { echo baz; }
(
baz() { echo BAZ; }
baz # => BAZ
eval "baz" # => BAZ evalçµç±ã§åŒã³åºããŠãOK
)
ã»ãµãã·ã§ã«ã匷å¶çã«å¥ããã»ã¹ã«ïŒããŠãã°ãåé¿ïŒããæ¹æ³
(func) # ãµãã·ã§ã«ãå¥ããã»ã¹ã«ãªããªã
(ulimit -t unlimited; func) # 匷å¶çã«å¥ããã»ã¹ã«ãªã
# ulimitã¯å¥ããã»ã¹ãäœããªããšå®çŸã§ããªãããæé©åã黿¢ããããšããçå±ã ãã
modernish ãããžã§ã¯ããã
NONFORKSUBSH: as a performance optimisation, subshells are implemented without forking a new process, so they share a PID with the main shell. (AT&T ksh93; it has many bugs related to this, but there's a nice workaround: ulimit -t unlimited forces a subshell to fork, making those bugs disappear! See also BUG_FNSUBSH.)
ã»ããŒã«ã«å€æ°ãäœããšãã®ããŒã¯ãŒãã local ã§ã¯ãªã typeset
ãããã local 㯠POSIX æºæ ã§ã¯ãªãããksh ãé€ãã°æ®ã©ã®ã·ã§ã«ã§ãµããŒããããŠãããïŒä»ã« local ã䜿ããªãã®ã¯ pboshãyash 2.48ããåãposh 0.5.4ããããšãã®åïŒ
# æ®ã©ã®ã·ã§ã«ã¯ local ã䜿ãã
func() {
local var
}
# ksh 㯠typeset ã®äžãfunction ã䜿ã£ãŠé¢æ°ãå®çŸ©ããªããã°æå¹ã«ãªããªã
function func {
typeset var
}
â ksh2020
ã³ãã¥ããã£ã®æã«ããå€§å¹ ã«ãªãã¡ã¯ã¿ãªã³ã°ãããããŒãžã§ã³ãããã AST ã®äžéšã§ãã ksh ã®ã¿ã倿Žããä»ã·ã¹ãã ãšäºææ§åé¡ãçãããã AT&T ã®æã«ãã£ãŠ æ°å¹Žã«æž¡ã 3000 以äžã®ã³ããããããŒã«ããã¯ããããïŒAT&TãšããŠã¯ 93u+ ãæçµå®å®ããŒãžã§ã³ãïŒããŒã«ããã¯ããããŸã§ã®é 93u+ ã®åŸç¶ãšããŠã¿ãªãããŠããã±ãŒãžããã§ã«é åžãããŠããããã©ããã©ããªã®ãæ··ä¹±ãããksh 2020 ãåŒãç¶ãã§ãããksh-community ãæ°ããäœæããããçŸæç¹ïŒ2020幎5æïŒã§ãããžã§ã¯ãã¯æŽ»çºã§ã¯ãªãä»åŸã©ããªããã¯äžéæïŒã©ãªããããå°ãçµç·¯ã詳现ã«ãŸãšããŠäžããã»ã»ã»ïŒ
äºææ§äžã®æ³šæç¹
倧ããªäºææ§åé¡ã¯ãªãããã«æãããïŒksh93ãšåçïŒãAT&Tãæ€åãããããã ãã现ããåé¡ãããã®ã ãããïŒå人çã«ã¯æ°å€èšç®ã®æµ®åå°æ°ç¹èª€å·®ã以åãšéãæ°ãããããããïŒ
Public Domain Korn shell ç³»
â pdksh - Public Domain Korn shell
ååã®éããåœæã¯ãªãŒãã³ãœãŒã¹ã§ã¯ãªãã£ã ksh ã®ãããªãã¯ãã¡ã€ã³å®è£
çãksh ãšã¯ç¡é¢ä¿ã1999幎é ãæåŸã«ã¡ã³ããã³ã¹ãããŠããããçŸåšã¯ pdksh ã®äºçš®ã®ã¿ã䜿ãããŠãããDebian ã§ã¯ Debian 6.0 (2011幎ïŒãŸã§å«ãŸããŠãããDebian 7.0 (2013幎ïŒã«ãå«ãŸããŠããããã«èŠãããããã㯠mksh ã ãã pdksh ã«è¿ã圢ã§ãã«ããã lkshãããŒãžã§ã³çªå·ã¯ $KSH_VERSION ã§ååŸå¯èœãïŒã¡ãªã¿ã«ç§ã¯ããŒãžã§ã³çªå· @(#)PD KSH v5.2.14 99/07/13.2 以å€ãèŠãããšããªããïŒ
è¿œèš 2021-05-29
loksh ã® CONTRIBUTORS ã«çްããããŒãžã§ã³ã®æ å ±ããã£ãã®ã§è¿œèš
- ? - 3.2 (1987 - 1989?) - Eric Gisin ïŒCharles Forsyth ã® public domain V7 shell ãããŒã¹ã«éçºïŒ
- 3.3? (date?) - John R MacMillan
- 4.0 - 4.9 (1991/11 - 1994/7) - Simon J. Gerraty
- 5.0 - 5.2 (1994/7 - ) - Michael Rendell
äºææ§äžã®æ³šæç¹
ã»ã¡ã¢ãªç®¡çã«ãã°ãããããã Bus Error, Bad address, Memory fault ãªã©åå äžæã®ãšã©ãŒã§åºŠã èœã¡ãããã®æã®ãšã©ãŒãåºããšãã®åå 远æ±ã¯å°é£ïŒæžãæ¹ãå°ãå€ããã ãã§è§£æ±ºããããšã©ãŒã«ãªã£ãããããïŒ
set -u
: "$@" # => pdksh: @: parameter not set ãšãããšã©ãŒã«ãªã
set -- ab a
echo ${1#$2} # => 空æå
â OpenBSD ksh
pdksh ããã©ãŒã¯ã OpenBSD 2.1ïŒ1997幎ïŒãã /bin/sh ãšããŠæ¡çšããããpdksh ãå
ã« OpenBSD ãã¡ã³ããã³ã¹ãããŠãããããã/bin/sh ã§èµ·åããå Žå㯠POSIX ã¢ãŒããšãªããããŒãžã§ã³çªå·ã¯ POSIX ã¢ãŒãã§èµ·åããå Žå㯠$SH_VERSION ã§ååŸå¯èœã/bin/ksh ã§èµ·åããå Žå㯠$KSH_VERSION ã§ååŸå¯èœãïŒã©ã¡ããããŒãžã§ã³çªå·ã¯åã @(#)PD KSH v5.2.14 99/07/13.2 ã§æŽæ°ãããŠãªãïŒ
OpenBSD 以å€ïŒLinuxãmacOSçïŒãžã®ç§»æ€çãè€æ°ååšããã
-
oksh - Portable OpenBSD ksh, based on the Public Domain Korn Shell (pdksh)
- å€ãã®ç°å¢ã§å®¹æã«ãã«ãã§ããããç§»æ€æ§ãéèŠããŠãã察å¿ããŠãããã©ãããã©ãŒã ãå€ã
-
loksh - A Linux port of OpenBSD's ksh
- äžæµããã®å€æŽãæå°éã«çã Linux ã®ã¿ã察象ãšããããšã§ã»ãã¥ãªãã£ãªã¹ã¯çã軜æžãããæ¹é
-
ksh - Port of the OpenBSD ksh shell
- éãããã¯ã«ãã Linux ãš macOS ã§ãããããŠåãïŒãšæžããŠããïŒ
äºææ§äžã®æ³šæç¹
ã»set -e ã®ãšã eval ã®äžã§ãšã©ãŒçµäºã«ãªããšäžæããã
ïŒDebian 3.0 ã® pdksh ãåãã ã 3.1 以éã§ã¯ä¿®æ£ãããŠãããïŒ
set -eu
eval "[ ]" &&: # æ¬æ¥ã¯äžæããŠã»ãããªã
eval "[ ] &&:" &&: # ã¯ãŒã¯ã¢ã©ãŠã³ã
â NetBSD ksh
NetBSD ã«å«ãŸããŠã /bin/ksh ã詳ããã¯èª¿ã¹ãŠããªãã OpenBSD ksh ãšã¯ç°ãªããªãªãžãã«ã® pdksh ãšåããããªãã°ãå«ãŸããŠããããããŸãã¡ã³ããã³ã¹ãããŠããªãæãããããããŒãžã§ã³çªå·ã¯ $KSH_VERSION ããååŸå¯èœãïŒããŒãžã§ã³çªå·ã¯æŽæ°ãããŠããã @(#)PD KSH v5.2.14 99/07/13.2 ã®ãŸãŸïŒ
äºææ§äžã®æ³šæç¹
set -u
: "$@" # => ksh: @: parameter not set ãšãããšã©ãŒã«ãªã
set -- ab a
echo ${1#$2} # => 空æå
â mksh - MirBSD Korn Shell
å
ã
㯠MirOS BSD çšãšããŠéçºïŒ2002幎é ïŒïŒãpdksh ãããã©ãŒã¯ããã·ã§ã«ãAndroid 4.0 以éã®ããã©ã«ãã·ã§ã«ããããä»ã®ã·ã§ã«ã 32bit OS ã§ã 64bitæŒç®ãè¡ããäžã64bit OSã§ãã£ãŠã POSIX ã§ä¿èšŒããã 32bit æŒç®ããè¡ããªããmksh ã«å«ãŸãã lksh (Legacy Korn shell built on mksh) ã䜿ãã° 64bit æŒç®ã¯åºæ¥ããããŒãžã§ã³çªå·ã¯ $KSH_VERSION ã§ååŸå¯èœã
äºææ§äžã®æ³šæç¹
ã»æŽæ°æŒç®ã 32bit
â posh - Policy-compliant ordinary shell
ç®æšã¯çŽ æŽããããå®åäžè¶³ããã°ãå€ã /bin/sh ã®ä»£ããã«äœ¿ãã®ã¯å±éºãpdksh ãããŒã¹ã« POSIX ã«å¿
èŠã®ãªãæ©èœãåé€ããæãããããžã§ã¯ããã¹ã¿ãŒãããŠããããã®ããããã£ãŠãã¯ãªãã£ã«ã«ãªãã°ãå
¥ããŠããŸã£ãããæ¬å®¶ã§ã¯ã¯ããæã«è§£æ±ºããããã°ãæªã ã«æ®ã£ãŠããããããéçºäžãšèããã»ããããã¬ãã«ã ã 0.13.2 ã§éçºã忢ããŠããã»ã»ã»ãšæã£ãããã®èšäºãæžããŠãããã¡ã«1幎åã¶ãã«æŽæ°ããããïŒãã§ã« 0.14.1 ãšããŠã¿ã°ãæãããŠãã®ã§ãŸããã°ããæŽæ°ãããªãæ°ããããïŒããŒãžã§ã³çªå·ã¯ $POSH_VERSION ããååŸå¯èœ
äºææ§äžã®æ³šæç¹
ã»alias ãååšããªããæå³çã« pdksh ããåé€ãããŠãããïŒalias ã¯äž»ã«ã€ã³ã¿ã©ã¯ãã£ãã·ã§ã«ã§äœ¿ããããã®ãªã®ã§ããããªãã¯ãªãããä»ã®ã·ã§ã«ã§ã¯ ksh88 ãé€ããŠãµããŒããããŠãããã·ã§ã«ã¹ã¯ãªãããšããŠãé¢çœãäœ¿ãæ¹ãã§ããã®ã§ã¡ãã£ãšæ®å¿µãïŒ
ã»set -u + func "$@" ã§èœã¡ããã¹ã¯ãªããã®æžãæ¹å
šäœã«åœ±é¿ããã®ã§ã²ãããè¿·æããªãå€ã ksh ã«ãåæ§ã®ãã°ãååšãããå€ãè¯ãã¯ãŒã¯ã¢ã©ãŠã³ãã§ãã foo ${1+"$@"} ã䜿ããã
ã»posh 0.10.2 ãããã§ã·ã°ãã«ãå
šãŠåããªãèŽåœçãªãã°ãæããïŒtrap : TERM ã kill -9 ãæ©èœããªãïŒãŸããã®ããŒãžã§ã³ã® $POSH_VERSION ã®å€ã¯ POSH_VERSION ãšããæååã«ãªã£ãŠãã
ã»type ãš command -v ãå®è£
ãããŠããªã
ã»ä»å€æ°å±éãã°ããåšãçã«å€æ°ã®ãã°ãæãã
ãã®ä»
éçºäžããŸã POSIX ã«æºæ ããŠãªããå°æ¥çã«æåŸ ã§ããããªãã®ãã¡ãïŒâ» POSIX ã«æºæ ããŠãããã©ããã®åºæºã¯ ShellSpec ãåäœãããããšãå¯èœãã©ããã§ããPOSIX æºæ çã®é«ããšã¯é¢ä¿ãããŸãããïŒ
â busybox hush
BusyBox ã«çµã¿èŸŒãŸããããäžã€ã®ã·ã§ã«ïŒãã«ãèšå®ã«ãã£ãŠã¯çµã¿èŸŒãŸããŠããªããBusybox ã® Docker ã€ã¡ãŒãžã§äœ¿ãããïŒashãšåæ§ POSIX æºæ ã§ ash ãããããã«è»œããã®ãç®æããŠããããã ãå®è£ ã¯ãŸã äžååã«æãããïŒéå»ã«ã¯ä»ã« lash, msh ãšããã·ã§ã«ãå®è£ ãããŠããããã ã廿¢ïŒ
â toysh (toybox)
BusyBox ã®çœ®ãæããç®æã ToyBox ãããžã§ã¯ãã®äžã®äžã€ãã·ã§ã« (toysh) ã«é¢ããŠã¯å€ãã®æ©èœããŸã å®è£ ãããŠããªããéçºã¯æŽ»çºã ããéçºããŠããã®ã¯ toysh ã ãã§ã¯ãªãã®ã§ toysh ã®å®æãŸã§ãããªãã«æéãããããšæãã
â gosh (mvdan/sh, shfmt)
ãã©ãŒããã¿ãŒãšããŠæåã ãã·ã§ã«ã€ã³ã¿ããªã¿ã®æ©èœãæã£ãŠãããProof of Concept ãšãããŠããå®è£ ã¯æå°éãéçºã¯æŽ»çºã ã POSIX ã·ã§ã«ãšããŠã®åªå 床ã¯äœããšæãããã
â mrsh - A minimal POSIX shell.
work in progress ãšæžããŠããããã«ãŸã éçºäžãéçºã¯ããã»ã©æŽ»çºã§ã¯ãªããç¶ç¶äžããããžã§ã¯ãã¹ããŒã¿ã¹äžã¯ããªãå®è£ ãããŠããããã«èŠãããããã°ãçµæ§æ®ã£ãŠããæããããã
â gash - Guile as Shell - Summary
ç®è¡åŒå±éãæªå®è£
ïŒå®è£
äžïŒDevelopment Status: Alpha ãšããããšãªã®ã§ãŸã ãŸã éçºäžãšèŠããããéçºã¯åæ»äž
â nsh
æçµçã«ã¯ POSIX æºæ ã§ bash ã®æ¡åŒµæ©èœãåãã fish ã®ãããªã€ã³ã¿ã©ã¯ãã£ãã·ã§ã«ãç®æããŠããã£ãœãããŸã ã¢ã«ãã¡ã§å®è£ ãããŠãªãæ©èœãå€ãããã ããéçºã¯ããã»ã©æŽ»çºã§ã¯ãªããªã£ãŠããŠããã
â rash - the Rust Bourne Shell
ãããžã§ã¯ãã¹ããŒã¿ã¹ã¿ãŠéèŠãªæ©èœãæªå®è£ ïŒæªå®æïŒãªãããªã®ã§è©ŠããŠããªããéçºã¯åæ»æ°å³ã
â gsh - A POSIX shell for Windows
Windows çšã«äœããã POSIX ã·ã§ã«ããããIssues ã¿ãŠ set -e ãå®è£
ãããŠããªããããªã®ã§è©ŠããŠããªããWindows ã«å¯Ÿå¿ããå Žå ls ã³ãã³ããªã©ãå®è£
ããªããšå®çšçã«ãªããªãã¯ãã§ããããå€éšã³ãã³ãã§çšæãããªã busybox-w32 ã§ããããªãšæã£ãŠããŸããè峿·±ãã·ã§ã«ãéçºã¯åæ»æ°å³ã