{"id":208,"date":"2026-05-13T11:49:18","date_gmt":"2026-05-13T03:49:18","guid":{"rendered":"https:\/\/junai.ai\/blog\/linux-safe-shell-script-22\/"},"modified":"2026-05-13T11:49:18","modified_gmt":"2026-05-13T03:49:18","slug":"linux-safe-shell-script-22","status":"publish","type":"post","link":"https:\/\/junai.ai\/blog\/linux-safe-shell-script-22\/","title":{"rendered":"\uc548\uc804\ud55c \uc178 \uc2a4\ud06c\ub9bd\ud2b8 \u2014 set -euo pipefail (22\ud3b8)"},"content":{"rendered":"\n<!-- WordPress REST API \ubc1c\ud589\uc6a9 HTML (\uc790\ub3d9 \uc0dd\uc131) -->\n<!-- WP-FEATURED-MEDIA-ID: 202 -->\n<div style=\"max-width:800px;margin:0 auto;\">\n<style>\n:root{\n  --color-primary:#1e40af;--color-accent:#3b82f6;--color-bg:#fafafa;--color-bg-card:#ffffff;\n  --color-text:#1e293b;--color-text-muted:#64748b;--hero-start:#0f172a;--hero-end:#1e40af;\n  --font-body:-apple-system,BlinkMacSystemFont,'Apple SD Gothic Neo','Noto Sans KR',sans-serif;\n  --size-body:17px;--line-height:1.75;--h1-size:32px;--h2-size:27px;--h3-size:20px;\n}\n*{margin:0;padding:0;box-sizing:border-box;}\n.wrap{max-width:760px;margin:0 auto;padding:0 20px;}\n.hero{background:linear-gradient(135deg,var(--hero-start) 0%,var(--hero-end) 100%);color:#fff;padding:64px 0 56px;text-align:center;}\n.hero .eyebrow{display:inline-block;font-size:13px;letter-spacing:1px;text-transform:uppercase;color:#93c5fd;font-weight:700;margin-bottom:16px;}\n.hero h1{font-size:var(--h1-size);line-height:1.32;letter-spacing:-0.3px;font-weight:800;margin-bottom:18px;}\n.hero p.sub{font-size:18px;color:#cbd5e1;max-width:620px;margin:0 auto;}\n.hero .meta{margin-top:22px;font-size:14px;color:#94a3b8;}\n.hero-img{display:block;width:100%;height:auto;}\narticle{padding:48px 0 24px;}\narticle h2{font-size:var(--h2-size);line-height:1.35;letter-spacing:-0.3px;font-weight:800;margin:48px 0 18px;padding-left:14px;border-left:5px solid var(--color-primary);}\narticle h2:first-of-type{margin-top:8px;}\narticle h3{font-size:var(--h3-size);font-weight:700;margin:28px 0 10px;color:#0f172a;}\narticle p{margin:0 0 18px;}\narticle ul,article ol{margin:0 0 18px 4px;padding-left:22px;}\narticle li{margin-bottom:9px;}\narticle strong{color:#0f172a;font-weight:700;}\narticle a{color:var(--color-primary);text-decoration:underline;text-underline-offset:2px;}\narticle code{background:#0f172a;color:#e2e8f0;padding:2px 7px;border-radius:5px;font-size:0.9em;font-family:'SF Mono',Menlo,Consolas,monospace;}\n.intro p:first-child{font-size:19px;color:#334155;}\n.notice{background:#eef2ff;border:1px solid #c7d2fe;border-radius:10px;padding:14px 18px;margin:0 0 30px;font-size:15px;color:#3730a3;}\n.notice b{color:#312e81;}\n.tablewrap{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:22px 0;}\ntable{width:100%;border-collapse:collapse;font-size:15px;background:var(--color-bg-card);}\nth,td{padding:11px 12px;text-align:left;border-bottom:1px solid #e2e8f0;vertical-align:top;}\nth{background:#f1f5f9;font-weight:700;color:#0f172a;}\ntd:first-child,th:first-child{font-weight:700;}\n@media (max-width:560px){\n  .tablewrap table,.tablewrap thead,.tablewrap tbody,.tablewrap tr,.tablewrap th,.tablewrap td{display:block;width:auto;}\n  .tablewrap thead{display:none;}\n  .tablewrap tr{margin:0 0 14px;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden;}\n  .tablewrap td{border:none;border-bottom:1px solid #f1f5f9;padding:9px 14px;}\n  .tablewrap td:first-child{background:#f1f5f9;font-weight:800;font-size:15.5px;}\n  .tablewrap td:last-child{border-bottom:none;}\n  .tablewrap td[data-label]::before{content:attr(data-label) \" \u2014 \";font-weight:700;color:var(--color-primary);}\n}\n.databox{background:#eff6ff;border-left:4px solid var(--color-accent);border-radius:0 8px 8px 0;padding:16px 18px;margin:20px 0;font-size:15.5px;}\n.databox b{color:var(--color-primary);}\n.warnbox{background:linear-gradient(135deg,#fffbeb 0%,#fef3c7 100%);border-radius:10px;padding:16px 18px;margin:22px 0;font-size:15.5px;color:#78350f;}\n.cmd{background:#0f172a;color:#e2e8f0;border-radius:10px;padding:14px 16px;margin:14px 0;font-family:'SF Mono',Menlo,Consolas,monospace;font-size:14px;line-height:1.8;overflow-x:auto;-webkit-overflow-scrolling:touch;white-space:pre-wrap;}\n.cmd .c{color:#7dd3fc;}\n.cmd .o{color:#94a3b8;}\n.cmd .t{color:#fbbf24;}\n.cmd .k{color:#c084fc;}\n.cmd .r{color:#f87171;}\n.roadmap{background:var(--color-bg-card);border:1px solid #e2e8f0;border-radius:12px;padding:18px 20px;margin:24px 0;font-size:15px;}\n.roadmap h3{margin:0 0 10px;font-size:17px;color:#0f172a;}\n.roadmap ol{margin:0 0 0 4px;padding-left:20px;}\n.roadmap li{margin-bottom:5px;color:#475569;}\n.cta{background:#0f172a;color:#e2e8f0;border-radius:14px;padding:26px 24px;margin:40px 0 8px;text-align:center;}\n.cta h3{color:#fff;margin:0 0 8px;font-size:19px;}\n.cta p{margin:0 0 4px;font-size:15px;color:#cbd5e1;}\n.cta a{color:#93c5fd;}\nfooter{padding:30px 0 50px;text-align:center;color:var(--color-text-muted);font-size:13.5px;}\n@media (max-width:480px){:root{--h1-size:23px;--h2-size:20px;--size-body:16px;}.hero{padding:48px 0 40px;}article{padding:34px 0 16px;}.cmd{font-size:12.5px;}}\n<\/style>\n<header class=\"hero\">\n  <div class=\"wrap\">\n    <span class=\"eyebrow\">\uc6b0\ubd84\ud22c \u00b7 \ub9ac\ub205\uc2a4 \uc785\ubb38 \u2014 22\ud3b8 (\uace0\uae09)<\/span>\n    <h1>\uc548\uc804\ud55c \uc178 \uc2a4\ud06c\ub9bd\ud2b8 \u2014 set -euo pipefail\u00b7trap\u00b7shellcheck (22\ud3b8)<\/h1>\n    <p class=\"sub\">21\ud3b8\uc5d0\uc11c \ub9cc\ub4e0 \uc2a4\ud06c\ub9bd\ud2b8\uac00 &#8220;\ub3d9\uc791\uc740 \ud558\ub294\ub370&#8221; \uc5b4\ub290 \ub0a0 \uc870\uc6a9\ud788 \ub9dd\uac00\uc9d1\ub2c8\ub2e4. \uadf8\uac78 \ub9c9\ub294 \ud55c \uc904 \ubc29\uc5b4\uc640 \ub514\ubc84\uae45\u00b7\uc815\ub9ac \ub3c4\uad6c\ub4e4.<\/p>\n    <p class=\"meta\">2026\ub144 5\uc6d4 13\uc77c \u00b7 \uc57d 8\ubd84 \u00b7 26\ud3b8 \uc785\ubb38 \uc2dc\ub9ac\uc988 22\ud3b8<\/p>\n  <\/div>\n<\/header>\n\n<img decoding=\"async\" class=\"hero-img\" src=\"https:\/\/junai.ai\/blog\/wp-content\/uploads\/2026\/05\/hero-29.jpg\" alt=\"deploy.sh \ud30c\uc77c \uc0c1\ub2e8\uc5d0 set -euo pipefail\u00b7IFS\u00b7trap \uc774 \uc788\uace0 shellcheck\u00b7bash -x \ub85c \uac80\uc0ac\ud558\ub294 \ud130\ubbf8\ub110 \ud654\uba74 \uc77c\ub7ec\uc2a4\ud2b8 \u2014 \uc548\uc804\ud55c \uc178 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc0c1\uc9d5\">\n\n<div class=\"wrap\">\n<article>\n\n  <div class=\"intro\">\n    <p>21\ud3b8\uc5d0\uc11c \uccab \uc178 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ub9cc\ub4e4\uc5c8\uc8e0. \ubb38\uc81c\ub294 \u2014 \uadf8\uac8c <strong>\ud2c0\ub824\ub3c4 \uba48\ucd94\uc9c0 \uc54a\uace0 \ub05d\uae4c\uc9c0 \ub2ec\ub9b0\ub2e4<\/strong>\ub294 \uac81\ub2c8\ub2e4. \ub514\ub809\ud1a0\ub9ac \ub9cc\ub4e4\uae30\uc5d0 \uc2e4\ud328\ud588\ub294\ub370 \uadf8 \uc548\uc5d0 \ud30c\uc77c\uc744 \ubcf5\uc0ac\ud558\ub824 \ub4e4\uace0, \ubcc0\uc218 \uc774\ub984\uc5d0 \uc624\ud0c0\uac00 \ub0ac\ub294\ub370 \ube48 \uac12\uc73c\ub85c \ucc98\ub9ac\ud558\uace0, \ud30c\uc774\ud504 \uc911\uac04\uc774 \uae68\uc84c\ub294\ub370 &#8220;\uc131\uacf5&#8221;\uc774\ub77c\uace0 \ud569\ub2c8\ub2e4. \uc774\ubc88 \ud3b8\uc740 \uadf8 &#8220;\uc870\uc6a9\ud55c \ub9dd\uac00\uc9d0&#8221;\uc744 \ub9c9\ub294 \ubc95 \u2014 \uac70\uc758 \ub2e4 <strong>\uc2a4\ud06c\ub9bd\ud2b8 \uccab\uba38\ub9ac \uba87 \uc904<\/strong>\ub85c \ud574\uacb0\ub429\ub2c8\ub2e4.<\/p>\n    <div class=\"notice\"><b>\uba3c\uc800:<\/b> 21\ud3b8(\uc178 \uc2a4\ud06c\ub9bd\ud2b8 \uae30\ubcf8 \u2014 \ubcc0\uc218\u00b7if\u00b7for\u00b7\ud568\uc218\u00b7exit)\uc744 \ubd24\ub2e4\uba74 \uc774\uc5b4\uc9d1\ub2c8\ub2e4. \uc0c8 \uba85\ub839\uc740 \uac70\uc758 \uc5c6\uace0, &#8220;\uc9c0\uae08 \uc9dc\uace0 \uc788\ub294 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ub354 \ud2bc\ud2bc\ud558\uac8c&#8221; \ub9cc\ub4dc\ub294 \uc2b5\uad00\ub4e4\uc774\uc5d0\uc694. \uc774\ubc88 \ud3b8 \uc21c\uc11c \u2014 <strong>\u2460 <code>set -euo pipefail<\/code> \u2192 \u2461 \ub530\uc634\ud45c\u00b7IFS \u2192 \u2462 trap\u00b7\ub514\ubc84\uae45\u00b7shellcheck \u2192 \u2463 \uc548\uc804\ud55c \ud15c\ud50c\ub9bf<\/strong>.<\/div>\n  <\/div>\n\n  <h2>\uc2a4\ud06c\ub9bd\ud2b8\uac00 &#8216;\uc870\uc6a9\ud788 \ub9dd\uac00\uc9c0\ub294&#8217; \ud328\ud134 \u2014 \uadf8\ub9ac\uace0 \ud55c \uc904 \ubc29\uc5b4<\/h2>\n  <p>\uc178\uc758 \uae30\ubcf8 \ub3d9\uc791\uc740 &#8220;\ud55c \uba85\ub839\uc774 \uc2e4\ud328\ud574\ub3c4 \uadf8\ub0e5 \ub2e4\uc74c \uc904\ub85c \uac04\ub2e4&#8221;\uc785\ub2c8\ub2e4. \uadf8\ub798\uc11c \uc774\ub7f0 \uc77c\uc774 \uc0dd\uaca8\uc694:<\/p>\n  <div class=\"cmd\"><span class=\"o\"># \uc704\ud5d8\ud55c \uc2a4\ud06c\ub9bd\ud2b8<\/span>\ncd <span class=\"t\">&#8220;$WORK_DIR&#8221;<\/span>          <span class=\"r\"># \u2190 $WORK_DIR \uac00 \ube44\uc5b4 \uc788\uc73c\uba74 cd \uac00 \ud648\uc73c\ub85c \uac00\ubc84\ub9bc<\/span>\nrm -rf temp\/             <span class=\"r\"># \u2190 \uadf8\ub798\uc11c \ud648\uc758 temp\/ \uac00 \uc9c0\uc6cc\uc9c8 \uc218\ub3c4\u2026<\/span>\nresult=<span class=\"t\">$(grep &#8220;x&#8221; data.txt | sort)<\/span>   <span class=\"r\"># grep \uc774 0\uac74 \ucc3e\uc544 \uc2e4\ud328\ud574\ub3c4 result \ub294 \uadf8\ub0e5 \ube48 \uac12<\/span><\/div>\n  <p>\ud574\uacb0\uc740 \uc2a4\ud06c\ub9bd\ud2b8 \uccab\uba38\ub9ac(shebang \ubc14\ub85c \ub2e4\uc74c)\uc5d0 \uc774 \ud55c \uc904:<\/p>\n  <div class=\"cmd\"><span class=\"c\">#!\/usr\/bin\/env bash<\/span>\n<span class=\"t\">set -euo pipefail<\/span><\/div>\n  <div class=\"tablewrap\">\n  <table>\n    <thead><tr><th>\uc635\uc158<\/th><th>\ubb34\uc5c7\uc744 \ub9c9\ub098<\/th><\/tr><\/thead>\n    <tbody>\n      <tr><td><code>set -e<\/code> (errexit)<\/td><td data-label=\"\ubb34\uc5c7\uc744 \ub9c9\ub098\">\uba85\ub839\uc774 \uc2e4\ud328(0 \uc544\ub2cc \uc885\ub8cc\ucf54\ub4dc)\ud558\uba74 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc989\uc2dc \uc911\ub2e8. &#8220;\uc2e4\ud328\ud588\ub294\ub370 \uacc4\uc18d \ub2ec\ub9ac\ub294&#8221; \uac78 \ub04a\ub294\ub2e4. (\ub2e8 <code>if \uba85\ub839; then<\/code> \ucc98\ub7fc \uc870\uac74\uc73c\ub85c \uc4f4 \uba85\ub839\uc740 \uc608\uc678 \u2014 \uadf8\uac74 \uc815\uc0c1.)<\/td><\/tr>\n      <tr><td><code>set -u<\/code> (nounset)<\/td><td data-label=\"\ubb34\uc5c7\uc744 \ub9c9\ub098\">\uc815\uc758\ub418\uc9c0 \uc54a\uc740 \ubcc0\uc218\ub97c \uc4f0\uba74 \uc5d0\ub7ec. \ubcc0\uc218\uba85 \uc624\ud0c0(<code>$WROK_DIR<\/code>)\ub098 \ubbf8\uc124\uc815 \ubcc0\uc218\uac00 &#8220;\ube48 \uac12&#8221;\uc73c\ub85c \uc870\uc6a9\ud788 \ub118\uc5b4\uac00\ub294 \uac78 \ub9c9\ub294\ub2e4. (\uc77c\ubd80\ub7ec \ube44\uc5b4\ub3c4 \ub418\uac8c \ud558\ub824\uba74 <code>${VAR:-\uae30\ubcf8\uac12}<\/code>.)<\/td><\/tr>\n      <tr><td><code>set -o pipefail<\/code><\/td><td data-label=\"\ubb34\uc5c7\uc744 \ub9c9\ub098\">\ud30c\uc774\ud504(<code>a | b | c<\/code>)\uc5d0\uc11c <strong>\uc911\uac04 \uba85\ub839\uc774 \uc2e4\ud328<\/strong>\ud574\ub3c4 \uc804\uccb4\ub97c \uc2e4\ud328\ub85c \uce5c\ub2e4. \uae30\ubcf8\uc740 \ub9c8\uc9c0\ub9c9 \uba85\ub839(<code>c<\/code>)\uc758 \uacb0\uacfc\ub9cc \ubd10\uc11c, <code>a<\/code>\uac00 \uae68\uc838\ub3c4 \ubaa8\ub984.<\/td><\/tr>\n    <\/tbody>\n  <\/table>\n  <\/div>\n  <p>\uc14b\uc744 \ud569\uccd0 <code>set -euo pipefail<\/code> \u2014 \uac70\uc758 \ubaa8\ub4e0 &#8220;\uad1c\ucc2e\uc740&#8221; \uc178 \uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc774 \uc904\ub85c \uc2dc\uc791\ud569\ub2c8\ub2e4. (\ub514\ubc84\uae45 \uc911 \uc77c\ubd80\ub7ec \ub044\uace0 \uc2f6\uc73c\uba74 <code>set +e<\/code> \uc2dd\uc73c\ub85c \uc7a0\uae50 \ud480 \uc218 \uc788\uc5b4\uc694.)<\/p>\n\n  <h2>\ub530\uc634\ud45c\uc640 IFS \u2014 \uacf5\ubc31\u00b7\ud2b9\uc218\ubb38\uc790\uc5d0 \uc548 \ubd80\uc11c\uc9c0\uac8c<\/h2>\n  <p>21\ud3b8\uc758 \uadf8 \ud568\uc815, \ub2e4\uc2dc: <strong>\ubcc0\uc218\uc640 <code>$@<\/code> \ub294 \ud070\ub530\uc634\ud45c\ub85c \uac10\uc2f8\uc138\uc694.<\/strong> <code>\"$file\"<\/code>, <code>\"$@\"<\/code>. \uc548 \uac10\uc2f8\uba74 \ud30c\uc77c\uba85\uc5d0 \uacf5\ubc31\u00b7\uc904\ubc14\uafc8\uc774 \uc788\uc744 \ub54c \ub2e8\uc5b4\uac00 \ucabc\uac1c\uc9c0\uac70\ub098, <code>*<\/code> \uac00 \ub4e4\uc5b4 \uc788\uc73c\uba74 \uc640\uc77c\ub4dc\uce74\ub4dc\ub85c \ud3bc\uccd0\uc9d1\ub2c8\ub2e4(globbing). <code>set -u<\/code>\uc640 \ud568\uaed8 \uac00\uc7a5 \ud754\ud55c \ubc84\uadf8 \uc6d0\ucc9c\uc774\uc5d0\uc694.<\/p>\n  <p>\uadf8\ub9ac\uace0 <strong>IFS<\/strong>(Internal Field Separator) \u2014 \uc178\uc774 &#8220;\ub2e8\uc5b4\ub97c \uc5b4\ub514\uc11c \ub04a\uc744\uc9c0&#8221; \uc815\ud558\ub294 \ubb38\uc790\uc785\ub2c8\ub2e4. \uae30\ubcf8\uc740 <strong>\uacf5\ubc31\u00b7\ud0ed\u00b7\uc904\ubc14\uafc8<\/strong>\uc774\ub77c, \uc904 \ub2e8\uc704\ub85c\ub9cc \ucc98\ub9ac\ud558\uace0 \uc2f6\uc744 \ub54c \ubb38\uc81c\uac00 \ub429\ub2c8\ub2e4. \uc2a4\ud06c\ub9bd\ud2b8 \uc0c1\ub2e8\uc5d0 \uc548\uc804\ud55c \uac12\uc73c\ub85c \uace0\uc815\ud558\ub294 \uad00\uc6a9\uad6c:<\/p>\n  <div class=\"cmd\">IFS=<span class=\"t\">$&#8217;\\n\\t&#8217;<\/span>     <span class=\"o\"># \uacf5\ubc31\uc740 \uad6c\ubd84\uc790\uc5d0\uc11c \ube7c\uace0, \uc904\ubc14\uafc8\u00b7\ud0ed\ub9cc \u2014 \ud30c\uc77c\uba85\uc5d0 \uacf5\ubc31 \uc788\uc5b4\ub3c4 \uc548 \ucabc\uac1c\uc9d0<\/span>\n\n<span class=\"o\"># \uc904 \ub2e8\uc704\ub85c \uc548\uc804\ud558\uac8c \uc77d\uae30 (\uacf5\ubc31 \ud3ec\ud568 \uc904\ub3c4 \ud1b5\uc9f8\ub85c)<\/span>\n<span class=\"k\">while<\/span> IFS= <span class=\"k\">read<\/span> -r line; <span class=\"k\">do<\/span>\n    echo <span class=\"t\">&#8220;\ud55c \uc904: [$line]&#8221;<\/span>\n<span class=\"k\">done<\/span> &lt; data.txt<\/div>\n  <div class=\"databox\"><b>\uc694\uc57d \uaddc\uce59 \uc14b:<\/b> \u2460 \ubcc0\uc218\u00b7<code>$@<\/code>\ub294 \ud56d\uc0c1 <code>\"$...\"<\/code> &nbsp; \u2461 \ud30c\uc77c \ubaa9\ub85d \ub3cc\ub9b4 \ub550 <code>for f in *.log<\/code>(\uc774\uac74 OK) \u2014 \ub2e8 <code>$(ls)<\/code> \uacb0\uacfc\ub97c \ucabc\uac1c \uc4f0\uc9c0 \ub9d0 \uac83 &nbsp; \u2462 <code>read<\/code> \ud560 \ub550 <code>read -r<\/code> (\ubc31\uc2ac\ub798\uc2dc \ud574\uc11d \uc548 \ud558\uac8c) + \uc904 \ub2e8\uc704\uba74 <code>while IFS= read -r line<\/code>. \uc774 \uc14b\uacfc <code>set -euo pipefail<\/code> \uc774\uba74 &#8220;\uc870\uc6a9\ud55c \ubc84\uadf8&#8221;\uc758 \ub300\ubd80\ubd84\uc774 \uc0ac\ub77c\uc9d1\ub2c8\ub2e4.<\/div>\n\n  <h2>\uc815\ub9ac(trap)\u00b7\ub514\ubc84\uae45(set -x)\u00b7\uc790\ub3d9 \uac80\uc0ac(shellcheck)<\/h2>\n  <p><strong>trap \u2014 \ub05d\ub0a0 \ub54c(\ub610\ub294 \uc8fd\uc744 \ub54c) \uc815\ub9ac\ud558\uae30.<\/strong> \uc784\uc2dc \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc5c8\uc73c\uba74 \uc2a4\ud06c\ub9bd\ud2b8\uac00 \ub3c4\uc911\uc5d0 \uc2e4\ud328\ud574\ub3c4 \uc9c0\uc6cc\uc838\uc57c \ud569\ub2c8\ub2e4. <code>mktemp<\/code> \uc73c\ub85c \uc548\uc804\ud55c \uc784\uc2dc \ud30c\uc77c\uc744 \ub9cc\ub4e4\uace0, <code>trap<\/code> \uc73c\ub85c \uc885\ub8cc \uc2dc \uccad\uc18c\ub97c \uc608\uc57d\ud558\uc138\uc694:<\/p>\n  <div class=\"cmd\">tmp=<span class=\"t\">$(mktemp)<\/span>                       <span class=\"o\"># \ucda9\ub3cc \uc5c6\ub294 \uc784\uc2dc \ud30c\uc77c (\uc608: \/tmp\/tmp.AbC123)<\/span>\n<span class=\"k\">trap<\/span> <span class=\"t\">&#8216;rm -f &#8220;$tmp&#8221;&#8216;<\/span> EXIT             <span class=\"o\"># \uc2a4\ud06c\ub9bd\ud2b8\uac00 \uc5b4\ub5bb\uac8c \ub05d\ub098\ub4e0 \uc774 \uc904 \uc2e4\ud589 \u2192 tmp \uc0ad\uc81c<\/span>\n<span class=\"o\"># trap &#8216;&#8230;&#8217; ERR  \u2192 \uc5d0\ub7ec \ub0ac\uc744 \ub54c\ub9cc,  trap &#8216;&#8230;&#8217; INT  \u2192 Ctrl+C \ub20c\ub800\uc744 \ub54c<\/span>\necho <span class=\"t\">&#8220;\uc791\uc5c5 \uc911&#8230;&#8221;<\/span> > <span class=\"t\">&#8220;$tmp&#8221;<\/span>\n<span class=\"o\"># &#8230; \uc5ec\uae30\uc11c \uc2e4\ud328\ud574\ub3c4 tmp \ub294 \uc790\ub3d9 \uc815\ub9ac\ub428<\/span><\/div>\n  <p><strong>\ub514\ubc84\uae45 \u2014 \uc5b4\ub514\uc11c \uba48\ucdc4\ub098 \ubcf4\uae30.<\/strong> <code>set -x<\/code>(xtrace)\ub294 \uc2e4\ud589\ub418\ub294 \uba85\ub839\uc744 \uadf8\ub300\ub85c \ucd9c\ub825\ud574\uc90d\ub2c8\ub2e4. \uc2a4\ud06c\ub9bd\ud2b8 \uc804\uccb4\uba74 <code>bash -x script.sh<\/code>, \uc77c\ubd80\ub9cc\uc774\uba74 \ucf54\ub4dc \uc0ac\uc774\uc5d0 <code>set -x<\/code> &#8230; <code>set +x<\/code>:<\/p>\n  <div class=\"cmd\"><span class=\"o\">$<\/span> bash -x deploy.sh\n<span class=\"o\">+ cd \/home\/me\/work<\/span>\n<span class=\"o\">+ DEST=\/home\/me\/backup<\/span>\n<span class=\"o\">+ &#8216;[&#8216; &#8216;!&#8217; -d \/home\/me\/backup &#8216;]&#8217;<\/span>      <span class=\"o\"># \uac01 \uc904 \uc55e\uc5d0 + \uac00 \ubd99\uc5b4 &#8220;\uc9c0\uae08 \uc774 \uba85\ub839&#8221; \ud45c\uc2dc<\/span>\n<span class=\"o\">+ mkdir -p \/home\/me\/backup<\/span><\/div>\n  <p><strong>\uc790\ub3d9 \uac80\uc0ac \u2014 shellcheck.<\/strong> \uc178 \uc2a4\ud06c\ub9bd\ud2b8\uc758 \ud754\ud55c \uc2e4\uc218\ub97c \uc7a1\uc544\uc8fc\ub294 \uc815\uc801 \ubd84\uc11d \ub3c4\uad6c\uc785\ub2c8\ub2e4. \uc124\uce58\ud558\uace0 \ub3cc\ub9ac\uba74 \ub429\ub2c8\ub2e4(11\ud3b8 <code>apt<\/code> \uae30\uc5b5\ub098\uc8e0?):<\/p>\n  <div class=\"cmd\"><span class=\"o\">$<\/span> sudo apt install shellcheck\n<span class=\"o\">$<\/span> shellcheck deploy.sh\n<span class=\"o\">In deploy.sh line 7:<\/span>\n<span class=\"o\">rm -rf $DEST\/old<\/span>\n<span class=\"r\">       ^&#8211; SC2086: Double quote to prevent globbing and word splitting.<\/span>   <span class=\"o\"># \u2190 &#8220;\uc30d\ub530\uc634\ud45c \uc50c\uc6cc\ub77c&#8221;<\/span><\/div>\n  <p>\ud3b8\uc9d1\uae30(VS Code \ub4f1)\uc5d0\ub3c4 shellcheck \ud655\uc7a5\uc774 \uc788\uc5b4\uc11c \uc800\uc7a5\ud560 \ub54c\ub9c8\ub2e4 \uc790\ub3d9\uc73c\ub85c \uc7a1\uc544\uc8fc\ub2c8, \uc775\uc219\ud574\uc9c0\uba74 \ub530\ub85c \ub3cc\ub9b4 \ud544\uc694\ub3c4 \uc5c6\uc5b4\uc694.<\/p>\n\n  <h2>\uc548\uc804\ud55c \uc2a4\ud06c\ub9bd\ud2b8 \ud15c\ud50c\ub9bf \u2014 \uadf8\ub9ac\uace0 \uc815\ub9ac<\/h2>\n  <p>\uc9c0\uae08\uae4c\uc9c0\ub97c \ubcf5\ubd99\uc6a9\uc73c\ub85c \ubaa8\uc73c\uba74 \u2014 \uc0c8 \uc2a4\ud06c\ub9bd\ud2b8\ub294 \uc774\uac78\ub85c \uc2dc\uc791\ud558\uc138\uc694:<\/p>\n  <div class=\"cmd\"><span class=\"c\">#!\/usr\/bin\/env bash<\/span>\n<span class=\"t\">set -euo pipefail<\/span>\nIFS=<span class=\"t\">$&#8217;\\n\\t&#8217;<\/span>\n\n<span class=\"o\"># \uc784\uc2dc \ud30c\uc77c \uc4f8 \uac70\uba74<\/span>\ntmp=<span class=\"t\">$(mktemp)<\/span>\n<span class=\"k\">trap<\/span> <span class=\"t\">&#8216;rm -f &#8220;$tmp&#8221;&#8216;<\/span> EXIT\n\n<span class=\"o\"># \uc778\uc790 \ud655\uc778 (21\ud3b8)<\/span>\n<span class=\"k\">if<\/span> [ <span class=\"t\">&#8220;$#&#8221;<\/span> -lt 1 ]; <span class=\"k\">then<\/span> echo <span class=\"t\">&#8220;\uc0ac\uc6a9\ubc95: $0 &lt;\uc778\uc790&gt;&#8221;<\/span>; <span class=\"k\">exit<\/span> 1; <span class=\"k\">fi<\/span>\n\nmain() {\n    <span class=\"o\"># \uc9c4\uc9dc \ud560 \uc77c<\/span>\n    echo <span class=\"t\">&#8220;\ucc98\ub9ac: $1&#8221;<\/span>\n}\nmain <span class=\"t\">&#8220;$@&#8221;<\/span><\/div>\n  <div class=\"warnbox\"><strong>\ud55c \uac00\uc9c0 \uc8fc\uc758:<\/strong> <code>set -e<\/code> \uac00 \ub9cc\ub2a5\uc740 \uc544\ub2d9\ub2c8\ub2e4 \u2014 \ud568\uc218 \uc548, <code>&&<\/code>\/<code>||<\/code> \uc758 \uc67c\ucabd, <code>if<\/code> \uc870\uac74 \ub4f1\uc5d0\uc120 \uc791\ub3d9 \ubc29\uc2dd\uc774 \ubbf8\ubb18\ud574\uc11c &#8220;\uc2e4\ud328\ud588\ub294\ub370 \uc548 \uba48\ucd94\ub294&#8221; \uacbd\uc6b0\uac00 \uc788\uc5b4\uc694. \uadf8\ub798\uc11c <strong>\uc911\uc694\ud55c \uba85\ub839\uc740 \uba85\uc2dc\uc801\uc73c\ub85c<\/strong> <code>\uba85\ub839 || { echo \"\uc2e4\ud328\"; exit 1; }<\/code> \ucc98\ub7fc \uc9c1\uc811 \ucc98\ub9ac\ud558\ub294 \uc2b5\uad00\uc774 \uc548\uc804\ud569\ub2c8\ub2e4. <code>set -euo pipefail<\/code> \ub294 &#8220;\uae30\ubcf8 \uc548\uc804\ub9dd&#8221;\uc774\uc9c0 &#8220;\ub2e4 \uc54c\uc544\uc11c \ud574\uc8fc\ub294 \ub9c8\ubc95&#8221;\uc740 \uc544\ub2d9\ub2c8\ub2e4.<\/div>\n  <div class=\"roadmap\">\n    <h3>\uc2dc\ub9ac\uc988 \ud750\ub984<\/h3>\n    <ol>\n      <li>1~20\ud3b8 \uc785\ubb38\u00b7\uae30\ucd08\u00b7\uc911\uae09 \u2714 &nbsp; 21\ud3b8 \uc178 \uc2a4\ud06c\ub9bd\ud2b8 \uc791\uc131\ubc95 \u2714 &nbsp; <strong>22\ud3b8 \uc548\uc804\ud55c \uc178 \uc2a4\ud06c\ub9bd\ud2b8 (\uc774 \uae00)<\/strong> \u2714<\/li>\n      <li>23\ud3b8 \u2014 \ud14d\uc2a4\ud2b8 \ucc98\ub9ac 3\uc885(<code>grep -E<\/code>\u00b7<code>sed<\/code>\u00b7<code>awk<\/code> \uc2e4\uc804)<\/li>\n      <li>24\ud3b8~ \u2014 \ub85c\uadf8\u00b7\ubaa8\ub2c8\ud130\ub9c1 \/ \uc11c\ubc84 \ubcf4\uc548 \ud558\ub4dc\ub2dd \/ \ub3c4\ucee4 \uc785\ubb38 (26\ud3b8 \uc644\uacb0)<\/li>\n    <\/ol>\n  <\/div>\n  <p>\uc815\ub9ac\ud558\uba74 \u2014 \uc178 \uc2a4\ud06c\ub9bd\ud2b8\ub97c &#8220;\ud2bc\ud2bc\ud558\uac8c&#8221; \ub9cc\ub4dc\ub294 \uac74 \uac70\ucc3d\ud55c \uac8c \uc544\ub2d9\ub2c8\ub2e4: \uccab\uba38\ub9ac\uc5d0 <code>set -euo pipefail<\/code> + <code>IFS=$'\\n\\t'<\/code>, \ubcc0\uc218\ub294 \ud070\ub530\uc634\ud45c, \uc784\uc2dc \ud30c\uc77c\uc740 <code>mktemp<\/code>+<code>trap<\/code>, \ub9c9\ud788\uba74 <code>bash -x<\/code>, \uadf8\ub9ac\uace0 \uac00\ub054 <code>shellcheck<\/code>. \uc774 \uc2b5\uad00 \uba87 \uac1c\uac00 &#8220;\uc5b4\ub290 \ub0a0 \uac11\uc790\uae30 \ub370\uc774\ud130\ub97c \ub0a0\ub9ac\ub294&#8221; \uc0ac\uace0\ub97c \ub9c9\uc544\uc90d\ub2c8\ub2e4. 23\ud3b8\uc5d0\uc11c\ub294 \uc2a4\ud06c\ub9bd\ud2b8 \uc548\uc5d0\uc11c \ud14d\uc2a4\ud2b8\ub97c \uc790\uc720\uc790\uc7ac\ub85c \ub2e4\ub8e8\ub294 <code>grep<\/code>\u00b7<code>sed<\/code>\u00b7<code>awk<\/code> \ub97c \uc2e4\uc804 \ud328\ud134 \uc911\uc2ec\uc73c\ub85c \ubd05\ub2c8\ub2e4.<\/p>\n\n  <p style=\"font-size:15px;color:#64748b;\">\ucc38\uace0: \ubcf8 \uae00\uc740 bash(\uc6b0\ubd84\ud22c \uae30\ubcf8 \uc178) \uae30\uc900\uc774\uba70 2026\ub144 5\uc6d4 13\uc77c\uc5d0 \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. <code>set -euo pipefail<\/code> \ub4f1 \uc77c\ubd80\ub294 sh\/dash(POSIX)\uc640 \ub3d9\uc791\uc774 \ub2e4\ub974\ub2c8 \uc2a4\ud06c\ub9bd\ud2b8 \uccab \uc904\uc744 <code>#!\/usr\/bin\/env bash<\/code>\ub85c \uba85\uc2dc\ud558\uc138\uc694.<\/p>\n\n  <div class=\"cta\">\n    <h3>\uc6b0\ubd84\ud22c\u00b7\ub9ac\ub205\uc2a4 \uc785\ubb38 \uc2dc\ub9ac\uc988<\/h3>\n    <p>&#8220;\ub3d9\uc791\ud558\ub294 \uc2a4\ud06c\ub9bd\ud2b8&#8221;\uc5d0\uc11c &#8220;\uc870\uc6a9\ud788 \uc548 \ub9dd\uac00\uc9c0\ub294 \uc2a4\ud06c\ub9bd\ud2b8&#8221;\ub85c \u2014 22\ud3b8\uc785\ub2c8\ub2e4. 23\ud3b8 &#8220;\ud14d\uc2a4\ud2b8 \ucc98\ub9ac 3\uc885(grep\u00b7sed\u00b7awk)&#8221;\uc73c\ub85c \uc774\uc5b4\uc9d1\ub2c8\ub2e4.<\/p>\n    <p>\ub2e4\uc74c \ud3b8\uc740 <a href=\"https:\/\/junai.ai\/blog\" target=\"_blank\" rel=\"noopener\">junai.ai\/blog<\/a> \uc5d0\uc11c \u2014 26\ud3b8\uae4c\uc9c0 \ucc28\ub840\ub85c \uc62c\ub77c\uc635\ub2c8\ub2e4.<\/p>\n  <\/div>\n\n<\/article>\n<\/div>\n\n<footer>\n  <div class=\"wrap\">\u00a9 2026 JUNAI \u00b7 \uc6b0\ubd84\ud22c\u00b7\ub9ac\ub205\uc2a4 \uc785\ubb38 \uc2dc\ub9ac\uc988 22\ud3b8 \u00b7 \ubcf8 \uae00\uc740 2026\ub144 5\uc6d4 13\uc77c \uae30\uc900\uc73c\ub85c \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/div>\n<\/footer>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\uc178 \uc2a4\ud06c\ub9bd\ud2b8 \uc548\uc804\ud558\uac8c \u2014 set -euo pipefail, \ub530\uc634\ud45c\u00b7IFS, trap\u00b7shellcheck, \uc548\uc804\ud55c \ud15c\ud50c\ub9bf. \ub9ac\ub205\uc2a4 \uc785\ubb38 22\ud3b8.<\/p>\n","protected":false},"author":1,"featured_media":202,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[],"class_list":["post-208","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ubuntu-linux"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts\/208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/comments?post=208"}],"version-history":[{"count":0,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts\/208\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/media\/202"}],"wp:attachment":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/media?parent=208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/categories?post=208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/tags?post=208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}