
AIãæžããã¡ãªã·ã§ã«ã¹ã¯ãªããããå®è¡ããåã«ç¢ºããã5ã€ã®ç¹
ã·ã§ã«ã¹ã¯ãªããã¯çãã5è¡ãããã°ãåŒæ°ãåãåã£ãŠããã©ã«ããçã¥ããŠãç§»åããŠããã«ããŸã§é²ãã
èªãã°åããæ°ãããŠããã®ãŸãŸå®è¡ããããªãã
ãã ãçãã¹ã¯ãªããã¯ãããŸãããå Žåãã ããåæã«ãã圢ã«ãªãããããåŒæ°ãä»ãå¿ãããã
ååã«ç©ºçœããã£ãããcd ã倱æãããã
ãã®å
ã§äœãèµ·ãããã¯ãè¡ãçºããã ãã§ã¯èŠãã«ããã
ããã§ãAIãæžããã¡ãªåœ¢ã®5è¡ã®ã¹ã¯ãªããã1ã€çšæããŠãå®è¡ããåã«èŠã5ã€ã®ç¹ãæŽçããã
空ã®å€æ°ãåŒçšç¬Šãcd ã®å€±æãset -euãshellcheck ã®5ã€ã ã
rm -rf ã®è¡ã¯ããã¹ãŠ echo ã®åŸãã«çœ®ããŠãæåãšããŠè¡šç€ºããã ãã«ããŠããã

詊ããç°å¢
䜿ã£ãã®ã¯ãshellcheck 0.11.0 ãš GNU bash 5.2.37ã
ãã®ç°å¢ã® /bin/sh 㯠dash ã ã
äœæ¥ã¯ãã¹ãŠãäœ¿ãæšãŠã®ãã£ã¬ã¯ã㪠/tmp/l3 ã®äžã§è¡ã£ãã
察象㮠bad.sh ã¯ãåŒæ°ã DIR ã«å ¥ããæ¶ãäºå®ã®è¡ã衚瀺ããcd ããŠãbuild ãšè¡šç€ºããã ãã®ã¹ã¯ãªããã ã
1. åŒæ°ã空ã®ãšããäœãæ¶ããã
åŒæ°ãä»ããã« sh bad.sh ãšå®è¡ãããšãDIR ã¯ç©ºã«ãªãã
rm ã®è¡ã¯ rm -rf /* ã«ãªããã«ãŒãçŽäžã®é
ç®ã«å±éãããã
ãã®ç°å¢ã§ã¯25åãã£ãã
衚瀺㯠rm -rf /bin /boot ⊠ãšç¶ããæåŸã« build ãšåºãŠãçµäºã³ãŒãã¯0ã ã£ãã
echo ãä»ããŠããªãã£ããããšèãããšã5è¡ã®çãã¯å®å¿ããçç±ã«ãªããªãã
æåã«èŠãã®ã¯ãåŒæ°ã空ã®ãšãã« rm ã cd ã®å¯Ÿè±¡ãäœã«ãªããã ã
2. åŒçšç¬Šããªããšãååãå²ãã
ååã«ç©ºçœããããã£ã¬ã¯ã㪠my dir ãæž¡ããšã衚瀺㯠rm -rf my dir/* ã«ãªããcd ã¯ãcan't cd to myãã§å€±æããã
ããã§ã build ãŸã§é²ã¿ãçµäºã³ãŒãã¯0ã ã£ãã
ls ã§ãåãããšãèµ·ãããls -d my dir ã¯ãmy ãš dir ãå¥ã
ã«æ¢ããŠããšã©ãŒã2ã€åºããã
ls -d "my dir" ã¯ã1ã€ã®ååãšããŠèŠã€ããã倿°ã¯ "$VAR" ãšãåŒçšç¬Šã§å²ãã§äœ¿ãã
3. cd ã倱æããŠããæ¢ãŸããªã
ååšããªãå Žæ /tmp/l3/no-such-dir ãæž¡ããšãcd ã®ãšã©ãŒãåºãã
ãããªã®ã«ã次ã®è¡ã® build ãŸã§é²ãã§ãçµäºã³ãŒãã¯0ã ã£ãã
ã·ã§ã«ã¹ã¯ãªããã¯ãäœãæå®ããªããã°ã倱æããè¡ã®æ¬¡ãžãã®ãŸãŸé²ããcd ã®åŸãã«æ¶ãåŠçãæžããŠãããããããã©ãã§åãã®ããèãããšèœã¡çããªãã
cd ã倱æãããšãã«æ¢ãŸããã©ããããå®è¡ã®åã«èŠãŠããã

4. å é ã« set -euãå¿ é ã®åŒæ°ã¯ ${1:?}
çŽãã good.sh ã§ã¯ãå é ã« set -eu ãæžããåŒæ°ã DIR=${1:?usage: good.sh DIR} ã§åãåãããã«ããã
åŒæ°ãªãã§å®è¡ãããšããusage: good.sh DIRããšåºãŠãçµäºã³ãŒã2ã§æ¢ãŸã£ãã
空æåãæž¡ããŠãåãã ã£ãã
ååšããªãå Žæãæž¡ããšãcd ã®ãšã©ãŒã®ããš build ã«ã¯é²ãŸãããã¯ãçµäºã³ãŒã2ã§æ¢ãŸã£ãã
"my dir" ãæž¡ãããšãã¯ãmy dir/a.txt ã1ã€ã®ååãšããŠæ±ããbuild in /tmp/l3/my dir ãšè¡šç€ºããã
set -e ãš set -u ã¯ãå¥ã
ã«ã詊ããã
set -e ããªããšãfalse ã®ããšã次ã®è¡ã®ãç¶ãããã衚瀺ãããã
set -e ãä»ãããšãfalse ã§æ¢ãŸã£ãŠçµäºã³ãŒãã¯1ã ã£ãã
set -u ã¯å€æ°åã®ã¿ã€ããã¹ã«å¹ãã
DIR ã DIRR ãšæžãééãããšãäœããªããã°ç©ºã®ã«ãã³ [] ã衚瀺ããŠãã®ãŸãŸé²ãã ã
set -u ãä»ãããšãDIRR: parameter not setãã§æ¢ãŸã£ãã

5. shellcheck ã«èªãŸãã
ãããŸã§ã®ç¹ããæ¯åèªåã®ç®ã ãã§æ¢ãã®ã¯ã€ããã
shellcheck ã¯ãã·ã§ã«ã¹ã¯ãªãããå®è¡ããã«èªãã§ãæžãæ¹ã®å±ãªãæãææããŠãããã
bad.sh ã«äœ¿ããšã3è¡ç®ãš4è¡ç®ã«ææãåºãã
1ã€ã¯ SC2086 ã§ãåŒçšç¬Šã§å²ãããšããææã ã
ãã1ã€ã¯ SC2164 ã§ãcd ã倱æãããšãã«åããããšããææã ã
çŽãæ¹ã®åè£ãšã㊠cd "$DIR" || exit ãŸã§è¡šç€ºãããçµäºã³ãŒãã¯1ã ã£ããçŽãã good.sh ã«äœ¿ããšãäœãåºããçµäºã³ãŒãã¯0ã ã£ãã
å
¬åŒã® README ã«ãããšãDebian ç³»ã§ã¯ aptãmacOS ã§ã¯ HomebrewãWindows ã§ã¯ winget ã§å
¥ããããã
ãã©ãŠã¶ã ãã§è©Šãã shellcheck.net ãããã
ãã®ç°å¢ã§ã¯ãå°çšã®ä»®æ³ç°å¢ã« pip ã§å
¥ãããã®ã䜿ã£ãã
éã£ãŠãããŸã æ®ããã®
5ã€ãå
šéšæžãŸããŠããå®å
šã ãšèšãåããããã§ã¯ãªãã
詊ããäžã§ãæ°ãã€ãããç¹ã4ã€ãã£ãã
set -e ãå¹ããªãå Žæããããif ã®æ¡ä»¶ã§åŒãã 颿°ã®äžã®å€±æãã|| ã®å·ŠåŽã®å€±æã§ã¯ãã¹ã¯ãªããã¯æåŸãŸã§é²ãã
sh ãš bash ã¯éããbash ã®æžãæ¹ã® [[ ]] ã sh ã§å®è¡ãããšã[[: not foundããšåºãã®ã«ãçµäºã³ãŒãã¯0ã ã£ããshellcheck ã¯ãsh ãšããŠæžãããã¹ã¯ãªããã® [[ ]] ã«èŠåãåºãã
ãã€ãã®éäžã®å€±æã¯ãset -e ã ãã§ã¯èŠããªããfalse | true ã®çµäºã³ãŒãã¯0ã§ãset -o pipefail ãä»ãããš1ã«ãªã£ãããã®ç°å¢ã® sh ãš bash ã§ã¯åãã ã£ãããã»ãã®ç°å¢ã® sh ã¯ç¢ºãããŠããªã
shellcheck ã¯ãæå³ãŸã§ã¯èŠãªããæ¬¡ã®å³ã® blind.sh ããã®äŸã

blind.sh ã¯ãåŒæ°ããªããšãã«å¯Ÿè±¡ãã«ãŒãã«ããããšããæžãæ¹ãããŠããã
shellcheck ã¯äœãåºãããçµäºã³ãŒãã¯0ã ã£ãã
å®è¡ãããšãrm -rf / ãšè¡šç€ºãããã
æžãæ¹ãšããŠã¯åé¡ããªãã®ã§ãæ©æ¢°ã¯æ¢ããªãã£ãã
äžæ¹ã§ãrm -rf "$DIR"/* ã®ããã«ã倿°ã空ã«ãªããš /* ã«åºããè¡ã«ã¯ãshellcheck ã SC2115 ã®èŠåãåºããã
"${DIR:?}" ãšæžãçŽããšãèŠåã¯æ¶ããã
ãã®ç¢ºèªã®ã¹ã¯ãªãã㯠rm -rf ãå«ãã®ã§ãå®è¡ã¯ãããshellcheck ã«èªãŸããã ãã ã
æ©æ¢°ãæŸãã®ã¯æžãæ¹ãæå³ã¯äººãèªã
shellcheck ã¯ãåŒçšç¬Šã®ä»ãå¿ãã cd ã®å€±æã®ãããªæžãæ¹ã®çãããã¡ããšæŸã£ãŠãããã
ããã©ããåŒæ°ããªããšãã«ã«ãŒããæ¶ãããæå³ã©ãããã©ããã¯å€æããªãã£ãã
ããã¯æžããåŽã®èããªã®ã§ãèªãäººãæ±ºãããããªãã
å
šéšãèªã¿èŸŒãå¿
èŠã¯ãªããšæããåŒæ°ã®åæå€ãšãæ¶ã察象ã®è¡ã
ãã®2ãæã ãã¯ãå®è¡ã®åã«èªåã®ç®ã§èªãã
ãŸãšã
åŒæ°ã空ã®ãšããrm ã cd ã®å¯Ÿè±¡ãäœã«ãªãããèŠã
倿°ã¯ "$VAR" ãšãåŒçšç¬Šã§å²ã
cd ã倱æãããšãã«æ¢ãŸãããèŠã
å é ã« set -euãå¿ é ã®åŒæ°ã¯ ${1:?ã¡ãã»ãŒãž}
shellcheck ãéããéã£ãŠããåæå€ãšæ¶ã察象ã¯èªåã®ç®ã§èªã
ã©ãããå®è¡ããåã«ã§ããããšã ãå®è¡ããŠããæ°ã¥ãããããã£ãšå®ãæžãã