MiniShell ๊ณผ์ ํ์ฑ๋ถ ๊ตฌ์โฆ
ํด๋น ๋ฌธ์๋ฅผ ์์ฑํ ์ดํ ํ์ฑ๋ถ์์ ์์ฃผ ๋ง์ ๋ด์ฉ์ด ์ถ๊ฐ๋๊ณ ๋ณ๊ฒฝ๋์๋ค. ๋ฐ๋ผ์ ํด๋น ๋ฌธ์๋ ํ์งํ๊ณ , ์๋ก์ด ๋ฌธ์์์ ์ ๋ฆฌํ๋ค.
1. ๊ฐ์
Minishell์์ ๊ฐ์ฅ ๋ณต์กํ๊ณ ๋ณ์๊ฐ ๋ง์ ๋ถ๋ถ์ ํ์ฑ๋ถ๋ผ๊ณ ํด๋ ๊ณผ์ธ์ ์๋๋ค. ํด๋น ๋ถ๋ถ์ ๊ตฌํํจ์ ์์ด์ ๋ง๊ตฌ์ก์ด๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ๋ณด๋ค๋, ์ ๋ฆฌํ๊ณ ๊ฑฐ๊ธฐ์ ๋ง์ถฐ์ ์ฝ๋๋ฅผ ์ฐ๋๊ฒ ๋ ๋น ๋ฅด๊ณ ์ ํํ ๊ธธ์ด๋ผ ํ๋จ๋์ด ํด๋น ๊ธ์ ์์ฑํ๋ค.
2. Parsing ์ง๋ฆฌํ
๋ฌธ์ \ flag | โ Flg | โ Flg | $ Flg | Flg ์์ |
---|---|---|---|---|
white | ๋ฌด์ | ๋ฌด์ | ํ๊ฒฝ๋ณ์๋์ฒด, ๋ฐ๋ก๋ค๋ฉด๊ทธ๋ฅ$ | cat, ๋ค์์ค |
โ | FlgOFF, cat | ๋ฌด์ | ํ๊ฒฝ๋ณ์๋์ฒด, FlgON | cat, FlgON |
โ | ๋ฌด์ | FlgOFF, cat | ํ๊ฒฝ๋ณ์๋์ฒด, FlgON | cat, FlgON |
$ | ๋ฌด์ | ์ค์ฒฉ | ํ๊ฒฝ๋ณ์๋์ฒด, FlgON | cat, ํ๊ฒฝ๋ณ์ |
| | ๋ฌด์ | ๋ฌด์ | ํ๊ฒฝ๋ณ์๋์ฒด, ๋ค์๋ฆฌ์คํธ | cat, ๋ค์๋ฆฌ์คํธ |
> | ๋ฌด์ | ๋ฌด์ | ํ๊ฒฝ๋ณ์๋์ฒด, ๋ค์์ํ์ผ | cat, ๋ค์์ํ์ผ |
ยป | ๋ฌด์ | ๋ฌด์ | ํ๊ฒฝ๋ณ์๋์ฒด, ๋ค์์ํ์ผ | cat, ๋ค์์ํ์ผ |
< | ๋ฌด์ | ๋ฌด์ | ํ๊ฒฝ๋ณ์๋์ฒด, ๋ค์์ํ์ผ | cat, ๋ค์์ํ์ผ |
ยซ | ๋ฌด์ | ๋ฌด์ | ํ๊ฒฝ๋ณ์๋์ฒด, ๋ค์์ํ์ผ | cat, ๋ค์์ํ์ผ |
- ๋ค์์ค : char**์์ ๋ค์ ์ค์ ์ถ๊ฐํ๊ณ cursor๊ฐ ์ด๋ฅผ ๊ฐ๋ฅดํค๊ฒ
- ๋ฌด์ : ํด๋น ๋ฌธ์๋ฅผ ํ ์คํธ ๊ทธ๋๋ก ์ธ์ํ๋ค.
- cat : cursor๊ฐ ๊ฐ๋ฅดํค๋ ๋ฌธ์์ด์ ์ง๊ธ๊น์ง์ ๋ฌธ์์ด cat
- ์ค์ฒฉ : flg๊ฐ ์ค๋ณต๋๋ ๊ฒฝ์ฐ๋ โFlgON๋ ์ํ์์ &๊ฐ ์ ๋ ฅ๋๋ ์ํ ๋ฟ์ด๋ค.
- ํ๊ฒฝ๋ณ์๋์ฒด : ํ๊ฒฝ๋ณ์ ์ด๋ฆ์ผ๋ก ์ธ์ํ๊ณ ์๋ ๋ฌธ์์ด์ ๊ฒ์ํด์ ํด๋นํ๋ ๋ฌธ์๋ฅผ cursor๊ฐ ๊ฐ๋ฅดํค๋ ๋ถ๋ถ์ catํ๋ค.
- FlgON / FlgOFF : ํด๋น ๋ฌธ์์ ๋์๋๋ Flg๋ฅผ ON/OFFํ๋ค.
- ๋ค์๋ฆฌ์คํธ : |์ ๊ฒฝ์ฐ ๋ค๋ฆ ๋ฆฌ์คํธ๋ก ์ด๋ํ๊ณ , cursor๊ฐ ์ด๋ฅผ ๊ฐ๋ฅดํค๊ฒ ํ๋ค. $๋ catํ ๋ ํด๋น ํ๊ฒฝ๋ณ์๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ผ๋ก ๋ณํ๋์ด cmds์ ์ ์ฅ๋๊ฒํ๋ค.
๊ทธ๋ ๋ค๋ฉดโฆ ์ด์ ์์ ์กฐ๊ฑด๋ค์ ์ด๋ป๊ฒ ์ฝ๋๋ก ๊ตฌํํ๋๋
3. ๋์๋ฐฉ์ ๋ฐ ์๋์ฝ๋
- ast์์ cursor๊ฐ ์ง๋ชฉํ๋ ๋ฌธ์์ด์ catํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ.
- cursor์ ์์น๋ ๋ฌธ์์ด์ ์์์ฃผ์๋ง์ ๊ฐ๋ฅดํค๋ฉฐ, flg์์ด whitespace๊ฐ ์ค๋ ๊ฒฝ์ฐ ๋ค์(์ค)๋ก ๋์ด๊ฐ๋ค.
- ํ์ดํธ ์คํ์ด์ค๊ฐ ์์ผ๋ฉด ์ ๋ถ ๋๊ธด ํ, ์ปค์๋ฅผ ๋ค์์ค๋ก ์ฎ๊ธด๋ค.
- idx์์น์์ slide(์คํ์ )์ ์ฆ๊ฐ์ํค๋ฉด์ ํ๋ฒ์ catํ์ฌ malloc ๋ฐ free์ ๋น๋๋ฅผ ์ค์ธ๋ค.
- cat ํ ๋๋ ๋จ์ํ cursor์๋ง catํ๋ฉด ํด๊ฒฐ๋๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- result๋ฅผ ๋ฐ๊ณ ์ ํด์ผํ๋ ๋์์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ค์ ๋ฌธ์๋ก ๋์ด๊ฐ๊ธฐ(๊ฒฝ์ฐ์ ๋ฐ๋ผ 1~2์นธ) -> ~ํ๋ ๊ฒฝ์ฐ
- idx๋ถํฐ idx+slide - 1๊น์ง๋ฅผ ์ปค์์ catํ๋ค. ์ด๋ slide == 0์ธ ๊ฒฝ์ฐ ์๋ฌด๊ฒ๋ ๋ถ์ด์ง ์๋ํ๋ฉฐ, $๊ฐ ON์ธ์ํ์์๋ ํ๊ฒฝ๋ณ์์์ ์ฐพ์์ catํ๋ค. -> ๊ทผ๋ฐ slide == 0์ธ๊ฒจ์ฐ strlcat์ ๋ฃ์ผ๋ฉด ์์์ ์๋ฌด๊ฒ๋ ์๋ถ์ผ๊ฑฐ๊ฐ์๋ฐ?
- ํ๊ธ์ ๋๊ธฐ๊ณ ๋ค์ ๋ฆฌ์คํธ๋ก ๊ฐ๋ค(๋ช ๋ น์ด or ํ์ผ๋ก ์ธํ )
- catํ ๋ ํ์ฌ์์น -1๊น์ง catํ๋ค. x
์์ .
- cursor๋์ ์ ๋ฒํผ๋ฅผ ์ด์ฉ. char**ํ์ cmds๋ฅผ ์ง์ ์ ์ผ๋ก ๋ค๋ฃจ๋ค๋ณด๋ ์๋ก์ด cmd์ค์ ์ถ๊ฐํด์ผํ ๋ ์ปค์ ๋์ ์ cmds์ ๋ ์ ๊ทผํด์ผ๋์ ์ฝ๋ ์ค์๊ฐ ๋ ๋์ด๋๊ณ ๊น๋ํด๋ณด์ด์ง ์์์. ๋ฒํผ๋ฅผ ์ด์ฉํด์ catํ๊ณ ๋ค์์ค๋ก ๋์ด๊ฐ์ผ ํ ๋๋ง cmds์ ์ ๊ทผํ์ฌ ๋ฒํผ๋ฅผ ๋ง์ง๋ง์ค์ ์ถ๊ฐํ๊ณ ๋ฒํผ๋ฅผ โโ๋ก ์๋ก ํ ๋นํ๋ฉด cmds์ ์ ๊ทผ์ ์ต์ํํ ์ ์๋ค.
- ๋ํ action์ ๋ฐํ๊ฐ์ ๋ฌธ์๋ก ๋ฐํํ์ฌ, ์ฌ๋ ค ๋ช ๋ น์ ์์๋๋ก ์ญ ์ํํ๊ฒ ํ๋ค. ์๋ฅผ ๋ค๋ฉด ๊ทธ๋ฅ ๊ณต๋ฐฑ์ ๋ง๋ ๊ฒฝ์ฐ CJIAW๋ฅผ ๋ฐํํ์ฌ catํ๊ณ , jumpํ๊ณ , index๋ฅผ ์ฎ๊ธด๋ค์, ์ ์ค์ addํ์ฌ, ์ค๋ณต๋ whitespace๋ฅผ ์ ๋ถ ์ ๊ฑฐํ๋ ์ผ๋ จ์ ๋์๋ค์ ๋ฐํํ๊ฒ ํ๋ค. action์ ๊ฐ์ง์ : jump, index ์ฎ๊น, addnewline, cat, env, white, newlist
CJI : catํ๊ณ , jumpํ๊ณ , Index๋ฅผ ์ฎ๊น. -> ์ด์ ๊น์ง์ ํ ์คํธ๋ค์ ๋ฒํผ๋ก ์ฎ๊ธฐ๊ณ , ++slideํ๊ณ index += slideํ์ฌ ๋ฐฉ๊ธ์ ๋ฌธ์๋ฅผ ๋ค์ cat์ ๋ฐ์๋์ง ์๊ฒ ํ๋ค.
๋ฌธ์ \ flag | โ Flg | โ Flg | $ Flg | โ \& $ Flg | Flg ์์ |
---|---|---|---|---|---|
white | J | J | E | EIJ | CJIAW |
โ | FlgOFF / CJI | J | ECJI | EIJ | Flgset / CJI |
โ | J | FlgOFF / CJI | FlgON / EIJ | Flgoff / EJI | FlgON / CJI |
$ | J | Flgset / CJI | FlgON / EJI | EJI | CJI |
| | J | J | EJIN | EIJ | CJIN |
> | J | J | EJIN | EIJ | CJIN |
ยป | J | J | EJIN | EIJ | CJIN |
< | J | J | EJIN | EIJ | CJIN |
ยซ | J | J | EJIN | EIJ | CJIN |
while(๋ฌธ์์ด์ด ๋๋ ๋๊น์ง)
{
// ๋ค์์ ์ค๋ ๋ฌธ์๋ฅผ ๋ณด๊ณ ์ด๋ป๊ฒ ํ๋ํ ์ง + ํ๋๊ทธ ์ฌ์ค์
result = chk(&๋ฌธ์์ด[idx + slide]);
if (result == ๊ณต๋ฐฑ || ํ์ดํ || ๋ผ๋ค์ด๋ ์
๋ค || ์ฝํธ๋ค) {
strlcat(cursor, ๋ฌธ์์ด[idx], slide);
idx += slide;
slide = 0;
}
if (result == ๊ณต๋ฐฑ๋ ๋ฆฌ๊ธฐ) {
while(๊ณต๋ฐฑ๋ฌธ์)
++idx;
cursor = newstr(ast->txt);
}
else if (result == ๋์ด๊ฐ๊ธฐ)
++slide;
else if (result == ํ๊ฒฝ๋ณ์ cat) {
env_vlaue = findenv(env, ๋ฌธ์์ด[idx], slide);
strcat(cursor, env_value);
++idx;
}
else if (result == ํ์ดํ) {
๋ค์ ๋ฆฌ์คํธ ๋ง๋ฆ, ํ์
์
cousor = addone...();
++idx;
}
else if (result == ๋ฆฌ๋ค์ด๋ ์
) {
ast์ถ๊ฐ;
set_redirec_type(ast, result);
++idx;
if (result == <<, >>)
++idx;
}
}
// ๋จ์ด๋ฅผ ์ฝ๊ณ ๊ฒ์ฆ์ ์์ฒญํ๋ ํจ์.
int request(char **line) {
return responese()
}
// ์ ์ ์ธ ํ๋๊ทธ์, ๋ฐ์ ์์ฒญ์ ๋ฐํ์ผ๋ก ํ๋์ ๋ฐํํ๋ ํจ์.
// ์ด๋ ์๋ฅผ ๋ค๋ฉด ํ์ดํํ์ธ ์์ฒญ ์ ํธ์ ํ์ดํ์ ์ ํฉํ ํ๋์ ํ๋ผ๋ ์ ํธ๊ฐ ๊ฐ๋ค๋ฉด ์กฐ๊ฑด๋ฌธ์ฒ๋ฆฌ ํ ํ์ ์์ด ์
๋ ฅ์ ๊ทธ๋๋ก ๋ฐํํ๋ฉด ๋๋ค.
int response(char ) {
static flgs = 0b00000000;
// ํ๋๊ทธ๊ฐ ์ค์ฒฉ๋๋๊ฑด DQ์์ DL์ํ ๋ฟ์ด๋ค.
if (SQํ๋๊ทธ ON์ํ) {
SQ์
๋ ฅ์
๋ ฅ์ catํ๊ฒ ํ๊ณ (์๋ฏธ๋ฅผ ๊ฐ์ง = ์
๋ ฅ ๊ทธ๋๋ก ๋ฐํ)
์ด์ธ์๋ ์ ๋ถ ๋ฌด์ํ๋ ๋์ ๋ฐํ
}
else if (DQํ๋๊ทธ ON์ํ) {
์ฐ์ DQ์ catํ๊ฒ ํ๋ ๋์ ๋ฐํํ๊ณ
DL๋ง ์ค์ ํ๋๊ทธ ์ํค๊ณ , ๋๋จธ์ง๋ ๋ฌด์ ๋์ ๋ฐํ
}
else if (DLํ๋๊ทธ ON์ํ) {
ํ์ดํธ : flg unset(cat)
DQ, SQ, DL : flg unset(cat) + flg set
ํ์ดํ, ๋ฆฌ๋ค์ด๋ ์
: flg unset(cat) + ๊ทธ๋๋ก ๋ฐํ(๊ฐ๋ฅํ๊ฐ...?) -> flgํ์์ผ๋ก ๋ฐํํ๋ฉด ๋ ๋ฏ?
}
else {
๊ฐ ํ๋๊ทธ ์
๋ ฅ์ด๋ฉด ํ๋๊ทธ๋ฅผ setํ๋ค.
ํ์ดํ ๋ฐ ๋ฆฌ๋ค์ด๋ ์
์ธ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋ฐํ
}
}
flg๊ฐ ๋ณํ(ON->OFF, OFF->ON)์ด ๋๋ฉด ์ผ๋จ ๊ฑฐ๊ธฐ๊น์ง cat์ ํ๋ค.
echo "Hi$PATH hello"
์ ๊ฒฝ์ฐ $
๋ฅผ ๋ง๋๋ ์๊ฐ Hi
๊น์ง cat, $
์ดํ ํ์ดํธ์คํ์ด์ค(๊ณต๋ฐฑ)๊น์ง ๊ฐ์ ํ๊ฒฝ๋ณ์ ์ฐพ๊ณ cat, ๋ง์ง๋ง์ผ๋ก "
๋ฅผ ๋ง๋์ "
ํ๋๊ทธ๊ฐ OFF๋๋ฉด hello
๋ฅผ cat
$?
$? should expands to the exit status of the most recently executed foreground pipeline.
foreground pipeline : ํฌ๊ทธ๋ผ์ด๋์์ ์คํ๋ ํ์ดํ ์ฆ, minishell์์ $?๋ฅผ ๊ตฌํํ๋ค๋ฉด