ã¯ããã«
ãã®èšäºã¯ç§ãã·ã§ã«ã¹ã¯ãªããçšã®BDDãã¹ãã£ã³ã°ãã¬ãŒã ã¯ãŒã¯ ShellSpec ã®éçºãéããŠåŸãç§»æ€æ§ã»å¯æ¬æ§ã®é«ãã·ã§ã«ã¹ã¯ãªãããæžãããã®æè¡ã®ãŸãšããããã³é¢é£ããç§ã®èšäºãžã®ãªã³ã¯éã§ããé¢é£ããæ°ããèšäºãæžããããããããªã³ã¯ããŸãã®ã§ããã®ããŒãžãã¹ããã¯ãããªãããã¯ããŒã¯ããŠãããšè¯ããšæããŸãã
ãã®èšäºã倿Žéç¥ç®çã§ã¹ããã¯ããŠããæ¹ãž
èšäºãå€ããªããªã³ã¯éã®ã¡ã³ããã³ã¹ã倧å€ã«ãªã£ãããããã®èšäºã®å®æçãªæŽæ°ã¯ãããããšã«ããŸããããæŽæ°éç¥ãå¿
èŠãªæ¹ã¯ä»£ããã«ç§ããã©ããŒããŠãã ãããã»ãšãã©ã·ã§ã«ã¹ã¯ãªããé¢ä¿ã®èšäºããæžããŠããªãããããã§ååç®çãæããããšæããŸãã
Q & A
ãªãã·ã§ã«ã¹ã¯ãªããã§æžãã®ãïŒ
ã·ã§ã«ã¹ã¯ãªããã«ã¯ä»ã®ã¹ã¯ãªããèšèªã«ã¯ãªãç¹åŸŽãäºã€ãããŸããäžã€ç®ã¯ã·ã§ã«ã¹ã¯ãªããã¯ã³ãã³ãã飿ºãããã®ã«é©ããèšèªã§ãããšããããšã§ããã·ã§ã«ã¹ã¯ãªããã¯ã³ãã³ãã颿°ã«ããã«äœ¿ããèšèªã§ããã·ã§ã«é¢æ°ã§ããã³ãã³ããšäºææ§ãããããã«èšèšãããŠããŸããä»ã®èšèªã¯é¢æ°ã¯é¢æ°ã§ãã£ãŠã³ãã³ãã§ã¯ãããŸãããã³ãã³ããšé¢æ°ã®éãã¯ã³ãã³ãã¯æšæºåºåã«ããŒã¿ãåºåããæ»ãå€ã¯ïŒååãšããŠïŒçµäºã¹ããŒã¿ã¹ã§ããäžæ¹ä»ã®èšèªã®é¢æ°ã¯æšæºåºåã«ããŒã¿ãåºåããã®ã§ã¯ãªãå€ãšããŠæ»ãå€ãè¿ããŸããã³ãã³ããæšæºåºåã«ããŒã¿ãåºåããçç±ã¯ã人éããããèªãããšãåºæ¥ãããã«ããããã§ããã³ãã³ãã¯éå ·ãšããŠäººéãã·ã§ã«ããå®è¡ããŸãã人éãšã³ã³ãã¥ãŒã¿ã®äž¡æ¹ã«ãšã£ãŠäœ¿ããããã®ãã³ãã³ãã§ããããã®ã³ãã³ãã䜿ã£ãŠããã°ã©ã ã§ããã®ãã·ã§ã«ã¹ã¯ãªããã§ãããã®éããããããä»ã®èšèªã§ã¯ã·ã§ã«ã¹ã¯ãªããã眮ãæããããšãåºæ¥ãŸããããã ããã¹ãŠã®ããšãã·ã§ã«ã¹ã¯ãªããã ãã§ããã¹ãã ãšãã話ã§ã¯ãããŸãããã·ã§ã«ã¹ã¯ãªãããåŸæãªã®ã¯ã³ãã³ãã飿ºãããèªååã§ãããŠã§ãã·ã¹ãã éçºãªã©ãã以å€ã®å€ãã®çšéã«ã·ã§ã«ã¹ã¯ãªããã¯é©ããŠããŸãããã·ã§ã«ã¹ã¯ãªããã¯ä»ã®èšèªãšçµã¿åãããŠäœ¿ããã®ã§ãã£ãŠãä»ã®èšèªã§äœãããããã°ã©ã ããã£ãŠããã·ã§ã«ã¹ã¯ãªããã¯åœ¹ã«ç«ã€èšèªã§ãã
äºã€ç®ã¯å€ãã®ç°å¢ã§ã¹ã¯ãªããèšèªã®å®è¡ç°å¢ãã€ãŸãã·ã§ã«ãã€ã³ã¹ããŒã«ãããŠãããšããããšã§ããã¹ã¯ãªããèšèªã§ããããã¿ãŒã²ããOSåãã«ã³ã³ãã€ã«ããå¿ èŠããããŸãããã·ã§ã«ããå ¥ã£ãŠããã°ãLinuxãmacOSãBSD, Unix, Windows (WSL, Cygwin, MSYS) ãããã®ç°å¢ã§ãåããŸããïŒãã®èšŒæ ã« ShellSpec ã¯äžŠåå®è¡ãã©ã³ãã å®è¡ããããã¡ã€ã©ãªã©ã®æ©èœãæã¡ãªãããDocker ã® busybox ã€ã¡ãŒãžãšãã£ãæå°æ§æã§ã Debian 2.2 ã® bash 2.03 ãšãã£ãå€ãç°å¢ã§ãåäœããŸããïŒ
ã©ãã§ãåãããã«ããã®ã¯å€§å€ã§ã¯ïŒ
ã¯ã£ããèšã£ãŠå€§å€ã§ããæ¬åœã®æå³ã§ã©ãã§ãåãããã«ããã«ã¯ POSIX ã«æºæ ããã ãã§ã¯è¶³ããŸããããŸã POSIX ã³ãã³ãã¯ã©ã®ç°å¢ã§ã䜿ããã³ãã³ããšããããã§ã¯ãããŸãããPOSIX ã³ãã³ãã§ãã£ãŠãã€ã³ã¹ããŒã«ãããŠããªããã®ã¯å€æ°ãããŸãïŒè©³çްã¯POSIXã³ãã³ãã¯ãã©ã®ç°å¢ã«ãããã³ãã³ããã§ã¯ãªãããšãã話åç §ïŒãããšãã€ã³ã¹ããŒã«ãããŠãããšããŠããããããã®ã³ãã³ãã«ã¯çްããåãã«éãããããŸããPOSIX ã§èŠå®ãããŠããã³ãã³ãããªãã·ã§ã³ã§ããéãããããŸãããŸãã·ã§ã«ã«ãå®è£ ã®éãããã°ããããŸããbash ãªã©ã§äœ¿ãã䟿å©ãªé åã䜿ããŸããã POSIX æºæ ã®ã³ãã³ããæäœéã®æ©èœãããããŸããããªã«ããããããåžåããã©ã€ãã©ãªãäžè¶³ããŠããŸãããŸãã§åŸå¹Žã® JavaScript ã®äžçã®ããã§ãããªãã®æãããããªãã«é²ãã§ããŸãã°ãæåã®æ®µéã§è«ŠããŠããŸãããšã§ããããããã§ãã®èšäºãšããããã§ãã
ã·ã§ã«ã¹ã¯ãªããã¯ç§»æ€æ§ãäœãã®ã§ã¯ïŒ
ã¯ããã·ã§ã«ã¹ã¯ãªããã®ç§»æ€æ§ã¯äœãã§ããä»ã®èšèªã¯ç§»æ€æ§ã®åé¡ãã»ãšãã©æèããããšãªããåäžã®ã³ãŒãã§ã©ãã§ãåãããã«ãªããŸãããPOSIX ã«æºæ ããã ãã§ã¯äžååã§ãã·ã§ã«ã¹ã¯ãªããã¯ç°å¢ã®éãã«å¯Ÿå¿ããŠæžããªããã°ã©ãã§ãåãããã«ã¯ãªããŸãããã©ãã§ãåãããã«ãªããªãçç±ã®äžã€ã¯ãäžè¬çãªã·ã§ã«ã¹ã¯ãªãããå©çšããŠããæšæºçãªã³ãã³ã â UNIX (POSIX) ã³ãã³ãã«å®å šãªäºææ§ãç¡ãããã§ãããããã®ã³ãã³ãã¯åãã³ãã³ãåã§ãããªããå UNIX ç³» OS æ¯ã«ãã©ãã©ã«éçºãŸãã¯æ¡åŒµãããŠãããšããæŽå²çäºæ ã«ãã£ãŠåäœã«çްããéãããããŸãããã㯠POSIX ã§æšæºåãããŠããç¯å²ã§ãã£ãŠãåãã§ããPOSIX ã®æšæºåãšã¯åäœã®éããå®å šã«çµ±äžãããã®ã§ã¯ãªããéãéšåã¯éããšæèšããŠã¢ããªã±ãŒã·ã§ã³éçºè ã«æ³šæåèµ·ã察å¿ããããšãæ±ãããã®ã§ãããããã£ãŠ UNIX (POSIX) ã³ãã³ãã«äŸåããªããç§»æ€æ§ãé«ããããšã¯é£ãããç°å¢ããšã®éããææ¡ããŠããããã®éãã«å¯Ÿå¿ãããšããé¢åãªäœæ¥ãããªããããã©ãã§ãåãã·ã§ã«ã¹ã¯ãªããã«ã¯ãªããŸãããOS ãæã£ãŠããæšæºçãªã³ãã³ãã¯ç§»æ€æ§ãäœãéçºå¹çãäœãããããååã«çè§£ããå¿ èŠããããŸããã·ã§ã«ã¹ã¯ãªããã«ç§»æ€æ§ãæãããŠéçºããã®ã¯æéãããã倧å€ãªäœæ¥ãªã®ã§ããç§»æ€æ§åé¡ã解決ããéµã¯ãäŸåããå€éšã³ãã³ããæžããããšãšãç§»æ€æ§åé¡ã解決ããã©ãããŒã䜿ãããšã§ããShellSpec ã®éçºã§ã¯ç§»æ€æ§ã®åé¡ã解決ããããã«å€ãã®ã©ãããŒé¢æ°ãäœæããUNIX (POSIX) ã³ãã³ããå«ãå€éšã³ãã³ãã«ã¯é Œããã«ã·ã§ã«ã§å®è£ ã§ãããã®ã¯å¯èœãªéãã·ã§ã«ã§å®è£ ãããšããæ¹éãåã£ãŠããŸããäŸãã° sed ã awk ã§ãã䜿ã£ãŠããŸããïŒæ³šæ ShellSpec ã®æ¹éãç䌌ãå¿ èŠã¯ãããŸããïŒã
泚æ ã·ã§ã«ã¹ã¯ãªããã¯ç§»æ€æ§ãé«ã䞻匵ããèãæ¹ããããŸãããããã¯ã¬ã³ã«ãŒãºãæå±ãã UNIX å²åŠãUNIXãšããèãæ¹ãã«æžãããæçŸ©ãæ¢åã®å¹æãšç§»æ€æ§ãé«ããããã«ã·ã§ã«ã¹ã¯ãªãããå©çšãããã®ééã£ãçè§£ããæ¥ãŠããŸããäžèŠã·ã§ã«ã¹ã¯ãªããã®ç§»æ€æ§ãé«ããšèªãããããªæçŸ©ã§ããããUNIX ãšããèãæ¹ãã¯ãœãããŠã§ã¢ïŒã·ã§ã«ã¹ã¯ãªããïŒãç°ãªã OS ã«ç§»æ€ãããšãã話ã§ã¯ãªããããäžã€ã® UNIX ãå¥ã®ã¢ãŒããã¯ãã£ã®ã³ã³ãã¥ãŒã¿ã«ç§»æ€ãããšããè©±ãæžãããŠããæ¬ã§ãããããã£ãŠã»ãšãã©ã®äººãèãããã·ã§ã«ã¹ã¯ãªãããå¥ã® OS (UNIX) ã«ç§»æ€ããããšãã話ãããŠããŸããããããããã®æ¬ã¯ãå¹çããã C èšèªããšãïŒä»ã®ã³ã³ãã¥ãŒã¿ãžã®ïŒç§»æ€æ§ãé«ãã·ã§ã«ã¹ã¯ãªãããã®äºã€ã®èšèªã®æ¯èŒããããŠããããä»ã®èšèªã¯ç»å ŽããŠããŸããããã®çç±ã¯ããã®æ¬ã®èå°ã§ãã 1980 幎代㮠UNIX ã®éçºã®æä»£ã§ã¯ãããããããèšèªããªããã€ãŸããã®æ¬ã¯å€ãããæŽå²æžã ããã§ãããã¡ãã¡ç°å¢ã®éãã«èªåã§å¯ŸåŠããŠã³ãŒããæžããªããã°ãããªãã·ã§ã«ã¹ã¯ãªãããšãåäžã®ã³ãŒãã§ã©ãã§ãåãä»ã®èšèªã®ã©ã¡ããç§»æ€æ§ãé«ããã¯èšããŸã§ããªãã§ãããã詳现ã¯ãåèãUNIXãšããèãæ¹ - UNIXå²åŠãã¯æ¬åœã«åèãªã®ãïŒ ã èè ã®ã¬ã³ã«ãŒãºã¯äœè ãªã®ããšããšã調ã¹ãŠã¿ãããåç §ããŠãã ããã
ãªã POSIX ã§æšæºåãããæ©èœã®ã¿ã䜿ãã®ãïŒ
POSIX ã¯ç®çã§ã¯ãªãéå ·ã§ããããå€ãã®ç°å¢ã§ã·ã§ã«ã¹ã¯ãªãããåãããã«ããã®ãæ¬åœã®ç®çã§ããPOSIX ã¯ç§»æ€æ§ã®åé¡ãå®å šã«è§£æ±ºããæšæºèŠæ Œã§ã¯ãããŸããããããã§ãå¯èœãªéã POSIX ã§æšæºåãããæ©èœã®ã¿ã䜿çšããããã«å¿ãããŠããã°ãæªç¥ã®ç°å¢ã§ãå¥ã®ã³ãã³ããã€ã³ã¹ããŒã«ããããšãªãããã®ãŸãŸã®ç°å¢ã§åãããšãæåŸ ã§ããŸãããã ããã®æ¹éã§ã¯çç£æ§ã¯äœããªããŸããéèŠãªããšã§ãããç¹ã«çç±ããªãã®ã§ããã°å¥ã®ã³ãã³ããã€ã³ã¹ããŒã«ããã«åãããšã«ãã ãããªãããã«ããŠãã ãããPOSIX ã³ãã³ãã«ãã ãããã«ãã©ã®ç°å¢ã«ãã§ãç§»æ€ãããŠããã³ãã³ãã䜿ã£ãã·ã§ã«ã¹ã¯ãªããã®æ¹ãç§»æ€æ§ã¯é«ããªããŸãã
ShellSpec ã¯ç¹æ®ãªãœãããŠã§ã¢ã§ãããã¹ããã¬ãŒã ã¯ãŒã¯ãšããŠå¯èœãªéããã®ä»ã®ã³ã³ããŒãã³ãã«äŸåããªãããšãç®æããŠããŸããäžè¬çã«ã¯åç°å¢ã«ã³ãã³ãã远å ã€ã³ã¹ããŒã«ããããšã¯ã§ããã¯ãã§ããå€ãã®ç°å¢ã«ç§»æ€ãããŠããã³ãã³ãïŒãããã®å€ã㯠POSIX ã«æºæ ããŠäœãããŠããã©ãã§ãã€ã³ã¹ããŒã«ããŠäœ¿ããŸãïŒãå©çšããã°ãéçºå¹çãå€§å¹ ã«äžããããšãã§ããŸããéåžžã¯çç£æ§ãé«ãæ¹ãåªããŠããŸããShellSpec ã¯çç£æ§ãèœãšããŠã§ãããã®ä»ã®ã³ã³ããŒãã³ãã«äŸåããªãããã«ããŠããããã®å¶çŽã®äžã§ç§»æ€æ§ã»å¯æ¬æ§ããããããã«æè¡ããŸãšããã®ããã®èšäºã§ãã
æ¬åœã«ã©ãã§ãåããŸããïŒãã¹ãã¯ããŠããŸããïŒ
ãããã®æè¡ã¯ååãšã㊠ShellSpec ã®å®è£ æè¡ãå ã«ããŠãããäžéšãé€ã ShellSpec ãšåæ§ã®ç°å¢ã§ãã¹ãããŠããŸããïŒæã ãèšäºã«ããæã«ãã¹ããŠãããã°ãçºèŠãããããŠãŸããã»ã»ã»ãäžå¿å šéšä¿®æ£ããŠãã€ããã§ããïŒ ShellSpec ã®ãã¹ãç°å¢ã¯çŸæç¹ã§ãbashâ§2.03ããboshâ§2018/10/17ããbusyboxâ§1.10.2ããdashâ§0.5.2ããkshâ§93sããmkshâ§28ããposhâ§0.3.14ããyashâ§2.30ããzshâ§3.1.9ããOS 㯠Linux (Debian 2.2 以é)ãWindows (WSL, Cygwin, MSYS åºæ¬çã«ææ°ã®ã¿)ãmacOS (10.10以é)ãFreeBSD (10.x以é) ã§ããæ®å¿µãªãã UNIX ã¯æ±ããç°å¢ããªãã®ã§ãã¹ãã§ããŠããŸãããïŒSolaris ã ãã¯ãã¹ãããŠããŸãã CI ã§ã¯ãªãæåã§æã ãã£ãŠãã ããªã®ã§å°ãäžå®ã§ããïŒ
ãªã³ã¯é
ç§»æ€æ§ã»å¯æ¬æ§ã®é«ãã·ã§ã«ã¹ã¯ãªãããæžãããã®æè¡
ããããåå¥ã®èšäºã«ããŠããŸãã
- ã·ã§ã«ã¹ã¯ãªããã®echoã§âåé¡ãªãâè²ãã€ãã
- ã·ã§ã«ã¹ã¯ãªããã®echoã®ç§»æ€æ§ã®åé¡ã«æ¬æ°ã§å¯Ÿå¿ãã
- ã·ã§ã«ã¹ã¯ãªãã ãªãã·ã§ã³è§£æ 培åºè§£èª¬ (getopt / getopts)
- 髿©èœã§çãã·ã§ã«ã¹ã¯ãªããçšã®ãªãã·ã§ã³è§£æã³ãŒãïŒPOSIXã·ã§ã«æºæ ã»ç¬èªå®è£ ïŒ
- POSIXæºæ ã§ãreadlink -f ïŒå®å šäºæçïŒ
- ã·ã§ã«ã¹ã¯ãªããã§ä¹±æ°çæãå®è£ ãã(Xorshift32)
- POSIXæºæ ã®ã·ã§ã«ã¹ã¯ãªããã§ãã€ããªããŒã¿ãæ±ã
- POSIXæºæ ã®ã·ã§ã«ã¹ã¯ãªããã§ããã·ã¥å€ãèšç®ããïŒFNV-1 / FNV-1aå®è£ ïŒ
- ã·ã§ã«ã¹ã¯ãªããã§UNIXTIMEã®ååŸã𿥿ãšã®çžäºå€æïŒPOSIXæºæ dateã³ãã³ãã®ã¿äœ¿çšïŒ
- POSIXæºæ ã·ã§ã«ã¹ã¯ãªããã ãã§1ç§æªæºsleepãå®çŸãã
- ã·ã§ã«ã¹ã¯ãªããã§æååã眮æããreplace_all颿°ãäœããŸããïŒå®ã¯ã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã®è§£èª¬ïŒ
- ã·ã§ã«ã¹ã¯ãªããã®readãæ«å°Ÿæ¹è¡ãªããWindowsæ¹è¡ã³ãŒãã«å¯Ÿå¿ãããæ¹æ³
- ãããŸãŸãªèŠæãå¶ããã·ã§ã«ã¹ã¯ãªããã®usage颿°ã®æžãæ¹
- ã·ã§ã«ã¹ã¯ãªããã®set -eãçœ ãé¿ããŠäœ¿ãæ¹æ³
- POSIXæºæ ã·ã§ã«ã¹ã¯ãªããçšã®å¿ èŠååã§çãmktempã·ã§ã«é¢æ°
- ã¹ã¯ãªããèšèªãšããŠã¿ãåPOSIXã·ã§ã«ã®ç¹åŸŽãšäºææ§äžã®æ³šæç¹ãŸãšã
- ã·ã§ã«ã¹ã¯ãªããã§ç°¡åã«ãªãã·ã§ã³è§£æãã§ãããšã¬ã¬ã³ããªãªãã·ã§ã³ããŒãµãŒ
- ã·ã§ã«ã¹ã¯ãªããã§æååã®åå² (split) ãšçµå (join) ãããæã®ãã¹ããã©ã¯ãã£ã¹
- ã·ã§ã«ã¹ã¯ãªããã§ã·ã§ã«é¢æ°ã»å€éšã³ãã³ãã®ã¿ã€ã ã¢ãŠããè¡ã颿°ã®å®è£
- ã·ã§ã«ã¹ã¯ãªããã§çžå¯Ÿãã¹ã絶察ãã¹ã«å€æããæ£ããæ¹æ³
- ã·ã§ã«ã¹ã¯ãªããã§çžå¯Ÿãã¹ãšçµ¶å¯Ÿãã¹ãçžäºã«å€æãã颿°
- POSIXæºæ ã·ã§ã«ã®ããã®pipefailãšPIPESTATUSã®å®è£ ïŒæ¹è¯çïŒ
- ã·ã§ã«ã¹ã¯ãªããã§æšæºåºåãšæšæºãšã©ãŒåºåã«å¥ã ã®è²ããã£ã«ã¿ã§ã€ãã
- ã·ã§ã«ã¹ã¯ãªããã§é«éã«ãã¡ã€ã«å šäœãèªã¿èŸŒãæ¹æ³
- kill ã³ãã³ãã®äœ¿ãæ¹ãŸãšã
- POSIXæºæ ã·ã§ã«ã¹ã¯ãªããã§ãã«ãã³ã¢ã®èœåãæŽ»çšãã䞊ååŠçã®å®è£ ïŒæå€§äžŠåæ°ãããGNU Parallel, xargsãªãïŒ
- ç¶ã»POSIXæºæ ã·ã§ã«ã¹ã¯ãªããã§ãã«ãã³ã¢ã®èœåãæŽ»çšãã䞊ååŠçã®å®è£ ïŒååä»ããã€ãçïŒ
- POSIXæºæ ã·ã§ã«ã¹ã¯ãªããã§find -print0ãxargs -0ã䜿ããã«ã¹ããŒã¹ãæ¹è¡ãå«ãŸãããã¡ã€ã«åãåŠçãã
- ã·ã§ã«ã¹ã¯ãªããã§è€æ°ã®ãã¡ã€ã«ãåæã«ãªãŒãã³ããŠäº€äºã«èªã¿åã
- POSIXæºæ ã·ã§ã«ã¹ã¯ãªããã§ãªããžã§ã¯ãæåããã°ã©ãã³ã°
- ã·ã§ã«ã¹ã¯ãªããã§ãã©ãŠã¶ãèªåæäœãã Selenium/WebDriver bindings ãäœããŸãã
- ã·ã§ã«ã¹ã¯ãªãã(bashç)ã®åŒæ°è§£æã究極çã«ç°¡åã«ãªããŸãã
- POSIXæºæ ã®ã·ã§ã«ã¹ã¯ãªãããæžãããã®2ã€ã®åãã©ã€ãã©ãª
- ã·ã§ã«ã¹ã¯ãªããã®æ£èŠè¡šçŸã®è©³çŽ°è§£èª¬ïŒä»€åææ°çïŒã åºæ¬æ£èŠè¡šçŸ(BRE)ãšæ¡åŒµæ£èŠè¡šçŸ(ERE)
- ã·ã§ã«ã¹ã¯ãªããã§æ£èŠè¡šçŸã®ç §åã·ã³ãã«[.string.]ãšç䟡ã¯ã©ã¹[=char=]ãšæåã¯ã©ã¹[:classname:]ãæ£ããäœ¿ãæ¹æ³
- æ£èŠè¡šçŸã UNIX ã³ãã³ãã«å°å ¥ãã POSIX ã§æšæºåãããŸã§ã®æŽå²ãçŽè§£ããŠã¿ã
é¢é£æè¡
ãã®ä»ã®ã·ã§ã«ã¹ã¯ãªããé¢é£ã®èšäºã§ã
- ããã¿ïŒãMakefileã®äžèº«ãã·ã§ã«ã¹ã¯ãªãã100%ã§æžããŠã¿ã
- ãã£ãäžè¡ã§æ£ãã .env ãã·ã§ã«ã¹ã¯ãªããã«èªã¿èŸŒãæ¹æ³ïŒãš .env ã®ä»æ§ã«ã€ããŠïŒ
- awkãããã°ã©ãã³ã°èšèªãšããŠäœ¿ãæã®æè¡
- ã·ã§ã«ã¹ã¯ãªãã ãªãã¡ã¯ã¿ãªã³ã° ïœé ãã·ã§ã«ã¹ã¯ãªãããäŸé€ãããŠãã®ã§èçããŠ256åã«é«éåãããŸããïœ
- ã·ã§ã«ã¹ã¯ãªããã¯ãã€ãã䜿ããšäžŠååŠçãããŠéã ã»ã»ã» ã¯ç¥è©±ïŒïŒ
- ç§ãã·ã§ã«ã¹ã¯ãªããã§"ããã°ã©ãã³ã°"ãããçç±
- ã·ã§ã«ã¹ã¯ãªããã®ããã®è¯ããã¶ã€ã³ ïœ expr ãš bc ããç¥ãèšèšã®éã ïœ
- ã·ã§ã«ã¹ã¯ãªããã»bashçšãã¹ããã¬ãŒã ã¯ãŒã¯ bats ãéçºçµäºããã®ã§ bats-core ã«ç§»è¡ããŸããã
- Unix/Linux ã·ã§ã«èå€åŠ ïœã·ã§ã«ã¹ã¯ãªãããæ¬ç©ã®ããã°ã©ãã³ã°èšèªã§ããçç±ïœ
- ã·ã§ã«ã¹ã¯ãªããã®set -eãæ£ãã䜿ã£ãŠãšã©ãŒåŠçãæ¥œã«ãããïŒ
äºææ§ã®éããåžåããæè¡
ãã®èšäºããã ã®ãªã³ã¯éã«ããã®ã¯ãã£ãããªãã®ã§ãä»ã®èšäºã§ã¯èª¬æããªãã§ããããäºææ§ã®éããåžåããæ¹æ³ã玹ä»ããŸãã
ç§ã坿¬æ§ã®ããã·ã§ã«ã¹ã¯ãªãããæžãå Žåã以äžã®ãããªé çªã§äœ¿ãéå ·ãæ±ºããŠããŸãã
- ã·ã§ã«ã®æ©èœã ãã§å®çŸã§ãããªãã·ã§ã«ã ãã§å®è£ ãã
- æ©èœãããã©ãŒãã³ã¹ã®çç±ã§ã·ã§ã«ã§å®è£ ããã®ãé£ããå Žå㯠POSIX ã§èŠå®ãããã³ãã³ãïŒåã³ãã®ãªãã·ã§ã³ïŒã䜿çšãã
- ããã§ãé£ããå Žåã¯ç°å¢åºæã®ã·ã§ã«æ©èœãã³ãã³ããã䜿ããããã®ãšãäºææ§ã®éããåžåãã颿°ãäœæãã
ç§ãæžãèšäºã¯åºæ¬çã«ã·ã§ã«ã ãã§å®è£ ããã POSIX æºæ ã®ã³ãã³ãã ãã䜿çšããã®ã倧åãªã®ã§ 3.ã®äºææ§ã®éããåžåããæ¹æ³ã«ã€ããŠèª¬æããå Žæã¯å°ãªããšæãã®ã§ãããªã®ã§ããã§ç޹ä»ããããšæããŸãã
äŸ stat
stat 㯠POSIX ã§èŠå®ãããŠããã³ãã³ãã§ã¯ãããŸããããLinux ã§ã macOS (BSD) ã§ã䜿çšã§ããŸããããããã®ä»æ§ïŒãªãã·ã§ã³ïŒã¯å€§ããç°ãªããŸããäŸãã°ãã¡ã€ã«ãµã€ãºãååŸããæ¹æ³ã§ãã
# ãã¡ã€ã«ãµã€ãºã®ååŸ
stat -c %s /etc/hosts # Linux
stat -f %z /etc/hosts # macOS (BSD)
ãããäŸã«äºææ§ãåžåããæ¹æ³ã玹ä»ããŸãããŸãããããã§é¢æ°ãå®çŸ©ããŸãã
filesize() { # Linux
stat -c %s "$1"
}
filesize() { # macOS (BSD)
stat -f %z "$1"
}
1. äºææ§ãåžåãã颿°
äºææ§ãåžåããã«ã¯çŸåšã®ç°å¢ãå€å¥ãããã®2ã€ã®é¢æ°ã®ãã¡é©åãªæ¹ã®é¢æ°ãå®çŸ©ããŸããç°å¢ã®å€å¥ã¯ uname ã䜿çšã㊠Linux ãšããæåãå
¥ã£ãŠãããïŒ Darwin (macOS) ãå
¥ã£ãŠãããïŒã§åããæ¹æ³ãæãã€ããããããŸããããããã¯ããããããŸããããªããªã Darwin ã§ãã£ãŠã Linuxç (GNU ç) ã® stat ã䜿ãããå Žåãããããã§ããïŒHomebrew ã§ã¯å®éã«ãã®ãããªããšãåºæ¥ãŸããïŒ
ãã¹ããªæ¹æ³ã¯å®éã«ã³ãã³ããå®è¡ããŠãã®æåã§å€å¥ããããšã§ããå
·äœçã«ã¯ stat ã®å Žå stat -f / ã䜿ã£ãŠå€å¥ããããšãåºæ¥ãŸãããã®ãªãã·ã§ã³ã¯ Linux ã§ã¯ --file-system ãªãã·ã§ã³ãšåãæå³ã§ãã«ãŒããã¡ã€ã«ã·ã¹ãã ã®ã¹ããŒã¿ã¹ãè¿ããŸããmacOS (BSD) ã§ã¯ -f ã¯ãã©ãŒãããæååãªã®ã§ãã®ãŸãŸã®æåå / ãè¿ããŸãã
# Linux
$ stat -f /
File: "/"
ID: f148a0b23b752507 Namelen: 255 Type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 122661614 Free: 116726932 Available: 110478625
Inodes: Total: 31227904 Free: 30595983
# macOS (BSD)
$ stat -f /
/
ãã®ããã«æåã®éããå©çšããŠå®çŸ©ãã颿°ãåããããšãã§ããŸããïŒé·ãã®ã§é¢æ°ã¯äžè¡ã«ããŸããïŒ
if [ "$(stat -f /)" = / ]; then
filesize() { stat -f %z "$1"; } # macOS (BSD)
else
filesize() { stat -c %s "$1"; } # Linux
fi
泚æç¹ãšããŠã¯ãã©ã¡ãã§ããã§ã«åäœãå®çŸ©ãããŠããŠå®è¡ããŠãç¡å®³ãªãªãã·ã§ã³ã䜿çšãããšããããšã§ããããã®ãªãã·ã§ã³ã¯ Linux ã§ãã䜿ããªããããšããããšãå©çšããŠå€å¥ãããšãã®ã¡ã« macOS ã§å®è£
ãããŠåããªããªãå¯èœæ§ããããŸããïŒç¡å®³ãªãªãã·ã§ã³ã䜿ãçç±ã¯èšããŸã§ããªãã§ãããïŒèª¿ã¹ãã°å€§æµäœ¿ãããªãã·ã§ã³ãèŠã€ãããšæãã®ã§ããããªããã°ãã³ã°ãªãã·ã§ã³ã® --version ã --help ã§ããã°æ¯èŒçå®å¿ããŠäœ¿ãããšæããŸãããããã« --version ã --help ãä»ã®ç®çã«äœ¿ãããšã¯ãªãã§ãããã
2. å®çŸ©ãé å»¶ããã
ãã®é¢æ°ããæåã«äœ¿ãããæãã«å®çŸ©ããæ¹æ³ã§ãã
filesize() {
if [ "$(stat -f /)" = / ]; then
filesize() { stat -f %z "$1"; } # macOS (BSD)
else
filesize() { stat -c %s "$1"; } # Linux
fi
# ååã¯ããã§å®çŸ©ãã颿°ãåŒã³åºããæ¬¡åããã¯çŽæ¥å®çŸ©ãã颿°ã䜿çšãããã
filesize "$@"
}
ãã®æ¹æ³ã®ã¡ãªããã¯ãã³ãã³ãå€å¥ã®ã¿ã€ãã³ã°ãå®éã«äœ¿çšããã¿ã€ãã³ã°ãŸã§é ãããããšãåºæ¥ãã®ã§ãå¿ èŠããªãå Žåã«å€å¥ã®ã³ã¹ããæžããããããŸãè€éãªå€å¥åŠçãïŒã°ããŒãã«ïŒå€æ°ã䜿ããã«äœçœ®ãã©ã¡ãŒã¿ã䜿ã£ãŠè¡ãããšãã§ãããšããããšã§ããããŸãæå³ããªãäŸã§ãããã°ããŒãã«å€æ°ã䜿ããªããšããã®ã¯ãããããã®ã§ãã
filesize() {
# äœçœ®ãã©ã¡ãŒã¿ã倿°ã®ä»£ãããšããŠäœ¿ãããšã§
# ret=$(stat -f /) ã®ãããªã°ããŒãã«å€æ°(ret)ã®äœ¿çšãé¿ããããšãåºæ¥ã
set -- "$(stat -f /)" "$@"
if [ "$1" = / ]; then
filesize() { stat -f %z "$1"; } # macOS (BSD)
else
filesize() { stat -c %s "$1"; } # Linux
fi
shift
filesize "$@"
}
ãã ãããã®æ¹æ³ã¯ãµãã·ã§ã«ã䜿ããããšæ¯åå®çŸ©ããããšã«ãªã£ãŠããŸãã®ã§æ³šæããŠãã ããã
size1=$(filesize "file1") # ãµãã·ã§ã«ã䜿ãããŠãã®ã§å®çŸ©ããŠãç Žæ£ããã
size2=$(filesize "file2") # ãã£ãŠããã§ããŸãå®çŸ©ããã
filesize "file3" # ãµãã·ã§ã«ã䜿ã£ãŠããªãã®ã§ä»¥éã¯å®çŸ©ãããç¶æ
ãç¶ã
ãããé¿ããã«ã¯ read -r line ããã«åŒæ°ã«æå®ããååã®å€æ°ã«æ»ãå€ãè¿ãããã« filesize 颿°ã®ã€ã³ã¿ãŒãã§ãŒã¹ã倿ŽããŸãã
size1='' # åè shellcheck ã®æªå®çŸ©å€æ°ã®åç
§ãšããèŠåãéšãæ¹æ³
filesize size1 "file1" # ãµãã·ã§ã«ã§ã¯ãªãã®ã§å®çŸ©ããããŸãŸ
echo "$size1" # ãã¡ã€ã«ãµã€ãºã¯ size1 倿°ã«ä»£å
¥ãããŠãã
å®è£ ã§ãã
filesize() {
if [ "$(stat -f /)" = / ]; then
filesize() { eval "$1=\$(stat -f %z \"\$2\")"; } # macOS (BSD)
else
filesize() { eval "$1=\$(stat -c %s \"\$2\")"; } # Linux
fi
filesize "$@"
}
åŒæ°ã§æå®ãã倿°ã«æ»ãå€ãè¿ããšãããã¯ããã¯ã¯å¿çšã®å¹
ãåºãã®ã§èŠããŠãããšè¯ãã§ãããµãã·ã§ã«ã䜿çšããªãã®ã§ããã©ãŒãã³ã¹ã«ãåªããŠããŸãããã ã eval ã䜿çšããã®ã§å€æ°åçã«æå³ããªãæåãå
¥ããªãããã«æ³šæããŠäžãããè匱æ§ã«ã€ãªããå¯èœæ§ããããŸãã
3. 颿°å ã§ã®åå®çŸ©ãããã
ã2. å®çŸ©ãé å»¶ããããã¯éåžžã¯å šãŠã®ã·ã§ã«ã§åãã®ã§ããããŸãã«é¢æ°å ã§åã颿°åã§åå®çŸ©ãè¡ããšã·ã§ã«ã誀åäœïŒãã°ïŒïŒããå ŽåããããŸãããã®ç¶æ ã«ãªããšã·ã§ã«ãèœã¡ããå®çŸ©ããã¯ãã®é¢æ°ãæ¶ããŠããŸã£ãããšããªããªç¶æ³ã«ãªããŸããksh ã posh ã§ãŸãã«çºçããã®ã§ãããããã€ãã®æ¡ä»¶ãçµã¿åããã£ãŠçºçããŠããããã§ã¯ã£ãããšããæ¡ä»¶ã¯åãã£ãŠããŸããã
ãã®å Žåã¯ãé å»¶ãããã®ã諊ãã1. å®è£ ãã䜿ãã°ããã®ã§ãããå€å®æ¡ä»¶ãè€éãªå Žåã倿°ã䜿çšããããªããŸãããã ãã°ããŒãã«å€æ°ã¯äœ¿ããããªããšããå Žåã®å®è£ æ¹æ³ã§ãã
filesize() { # 1 段ç®
set -- "$(stat -f /)"
[ "$1" = / ] && return 0
return 1
}
if filesize; then # 2 段ç®
filesize() { eval "$1=\$(stat -f %z \"\$2\")"; } # macOS (BSD)
else
filesize() { eval "$1=\$(stat -c %s \"\$2\")"; } # Linux
fi
# åè ç°å¢ãè€æ°ããå Žå
filesize &&:
case $? in # 2 段ç®
0) filesize() { eval "$1=\$(stat -f %z \"\$2\")"; } ;; # macOS (BSD)
1) filesize() { eval "$1=\$(stat -c %s \"\$2\")"; } ;; # Linux
esac
åã颿°åã§ 2 ã€ã®åœ¹å²ãããããŠããŸãã1 段ç®ã¯ç°å¢å€å¥åŠçãè¡ãããã« filesize 颿°ã䜿çšããŠããŸãããã㊠2 段ç®ã§ç®çã®é¢æ°ãå®çŸ©ããŠããŸããäžè¬çã«ã¯åã颿°åã䜿ãåãã®ã¯ã©ãããšæããŸãã 1 段ç®ã¯ã°ããŒãã«å€æ°ã䜿çšããªãããã«äœ¿ãã ãã§æ¬æ¥ã¯äžèŠãªäžæçãªé¢æ°ãªã®ã§ãããããã¯è¯ããšããŠããŸãã
ããã«æ³šæã§ãããããã ãã§ã¯èª€åäœã解決ããªãå ŽåããããŸããksh ã§ãŸãã«çºçããã®ã§ãããã1. ãããã¬ãã«ã«é¢æ°ãå®çŸ©ããŠããããã2. ãããã¬ãã«ã§ãã®é¢æ°ãåŒã³åºããŠããããã3. ãã®é¢æ°ãåå®çŸ©ããŠããããã®ãã¹ãŠã®æ¡ä»¶ãæºãããšæå³äžæãªäžå
·åãçºçããããšããããŸããïŒå¿
ãçºçããããã§ã¯ãããŸãããïŒãã®å Žåã®ã¯ãŒã¯ã¢ã©ãŠã³ããšã㊠eval ã䜿çšããŠ2.ã®æ¡ä»¶ãæºãããªãããã«ããŸããå
·äœçã«ã¯æ¬¡ã®ããã«æžãæããŸãã
# filesize &&:
# â
eval "filesize &&:" &&:
# ãããã¬ãã«ã§é¢æ°ãå®çŸ©ã»åŒã³åºããããªããã°è¯ãã®ã§
# ãã¹ãŠã®åŠçã以äžã®ããã«é¢æ°å
ã«å
¥ããŠãè¯ã
initialize() {
...
filesize &&:
...
}
initialize
&&: ã 2 ã€ããã®ã¯ set -e ãæå¹ãªæã« mksh ã eval ã®äžã§çµäºããŠããŸãåé¡ã®ã¯ãŒã¯ã¢ã©ãŠã³ãã§ãã
ãããã«
POSIX ã§æšæºåãããæ©èœã ãã䜿ã£ãŠã·ã§ã«ã¹ã¯ãªãããäœæãããšå€ãã®å Žæã§ç°¡åã«åããããšãåºæ¥ãŸãããããããã¯ããªã倧å€ãªäœæ¥ã§ããäžçªã®çç±ã¯äºææ§ãåžåããã©ã€ãã©ãªããªãããšã§ã¯ãªãã§ããããïŒ ãã©ãŠã¶ã»JavaScript ã®äžçã§ãä»ã§ããè± jQuery ãªã©ãšèšãããŠããŸããæå㯠Prototype.js ã jQuery ãšããäºææ§ãåžåããã©ã€ãã©ãªã®ç»å Žããã£ããã«å€§ããå€ãã£ãŠãã£ããšèšæ¶ããŠããŸããéçºè
åã
ãã·ã§ã«ãã³ãã³ãã®äºææ§ãçœ ããã°ã«æ¯ãåãããŠããç¶æ
ã§ã¯ã·ã§ã«ã¹ã¯ãªããã§å¿«é©ãªéçºã¯ã§ããŸãããç®æãã¯ãããããŠããŠã®å
±æã§ã¯ãªããããããŠããŠãäžèŠãªäžçã§ããã©ã€ãã©ãªã . ã§èªã¿èŸŒãã§æäŸãããŠãã颿°ã䜿ãã°çްããããšãèããã«ç§»æ€æ§ã»å¯æ¬æ§ãå®çŸã§ãããã·ã§ã«ã¹ã¯ãªããã®äžçã«ãããããæµãã蚪ããã°è¯ããªãšç§ã¯èããŸãã
ç§èŠã§ãããããŸã§ã¯ã·ã§ã«ã¹ã¯ãªããã®"ã©ã€ãã©ãª"ã®ãã¹ãã¯å€§å€ã ã£ããšæããŸãããã¹ãã£ã³ã°ãã¬ãŒã ã¯ãŒã¯ã¯ãããŸããããããã¯ã·ã§ã«ã¹ã¯ãªããã䜿ã£ãŠïŒå€éšã³ãã³ãã®ïŒãã¹ããèšè¿°ã»å®è¡ããããã®ãã®ã§ãããã·ã§ã«ã¹ã¯ãªããèªèº«ããã¹ããããã®ã«ãªã£ãŠããªãïŒäžå¯èœã§ã¯ãªããããã¥ããïŒããã§ãããããä»ã¯ ShellSpec ããããŸããããã¯ã·ã§ã«ã¹ã¯ãªããèªèº«ãšã©ã€ãã©ãªã«æé©åããããã¹ãã£ã³ã°ãã¬ãŒã ã¯ãŒã¯ãªã®ã§ããããããå€ãã®ã©ã€ãã©ãªãçãŸããã·ã§ã«ã¹ã¯ãªããã®æçšæ§ãåèªèãããããããã¯ã·ã§ã«ãã®ãã®ã匷åããïŒbash çã®æ¡åŒµã¯ã»ããšæšæºåãããŠã»ããã§ããïŒåã³ãã³ããäºææ§åäžãšæ©èœåŒ·åãããã°ã·ã§ã«ã¹ã¯ãªããã§ã®éçºã¯ãã£ãšç°¡åã«ãªãã§ããããä»ã®èšèªã§å®è£
ããã°ãããšæããããããŸããããæšæºã§ã©ãã§ã䜿ããä»ã®ã·ã§ã«ããªããªãæªæ¥ãªããŠèª°ãæ³åã§ããªãã§ãããïŒã©ãã䜿ããªãå¿«é©ãªæ¹ãè¯ãã«è¶ããããšã¯ãããŸããã