- minishell
- Table of contents
- TODO
- Analyzing a subject
- Mandatory
- Bonus part
- Allow functions
- readline
- rl_clear_history
- rl_on_new_line
- rl_replace_line
- rl_redisplay
- add_history
- printf
- malloc
- free
- write
- access
- open
- read
- close
- fork
- wait
- waitpid
- wait3
- wait4
- signal
- sigaction
- sigemptyset
- sigaddset
- kill
- exit
- getcwd
- chdir
- stat
- lstat
- fstat
- unlink
- execve
- dup
- dup2
- pipe
- opendir
- readdir
- closedir
- strerror
- perror
- isatty
- ttyname
- ttyslot
- ioctl
- getenv
- tcsetattr
- tcgetattr
- tgetent
- tgetflag
- tgetnum
- tgetstr
- tgoto
- tputs
- parsing
- Assign Type
- syntax check
- execute
- ๋ค์ค ํ์ดํ
- redirection ์ฒ๋ฆฌ
- HERE_DOC
- ํ๊ฒฝ ๋ณ์ ๋ณํ
- quote trim ์ฒ๋ฆฌ
- leak ์ก๊ธฐ
- builtin pipe ์ฒ๋ฆฌ
- norm ์ฒ๋ฆฌ
- process ์ํ๊ฐ
- signal ์ฒ๋ฆฌ
- ctrl + D
- ctrl + C
- ctrl + \
- ํ๊ฒฝ๋ณ์ ์นํ
- ํ์ฌ ์์ : str => replace env => trim quote => parse
- ๋ฐ๊ฟ์ผํ ์์ : str => parse => replace env => trim quote
stateDiagram-v2
[*] --> (START)
(START) --> (FILENAME) : <, <<, (, command
(FILENAME) --> (OPERATOR) : &&, ||, >, >>, ), |
(OPERATOR) --> (COMMAND) : (, command
(COMMAND) --> (END) : >, >>, ||, &&, |
(END) --> [*] : exit, ctrl + D
-
[*]: Start state, ํ๋ก์ธ์ค๊ฐ ์์๋ ๋ ์คํ ๋งํ๊ฐ ์ด๋ ์ํ์์ ์์ํ๋์ง๋ฅผ ๋ํ๋ด๋ ํน๋ณํ ์ํ
-
(START): ํ์์ ์ด๊ธฐ ์ํ, ํ์๊ฐ ํ์ฑ ์์ ์ ์์ํ ๋ ์ฒ์์ ์ด ์ํ์ ์์
-
(FILENAME): ํ์ผ์ ๋ํ๋ด๋ ์ํ, ํ์๊ฐ ํ์ผ ์ด๋ฆ ๋ถ๋ถ์ ํ์ฑํ ๋ ์ด ์ํ์ ๋๋ฌํ๋ฉฐ ํ์ผ ์ด๋ฆ์ ์ ๋ ฅ ๋ฆฌ๋ค์ด๋ ์ ์ฐ์ฐ์(<, <<) ๋ค์์ ๋์ค๋ ๋ฌธ์์ด ๋งํจ
-
(OPERATOR): ๋ ผ๋ฆฌ ์ฐ์ฐ์(&&, ||)๋ฅผ ๋ํ๋ด๋ ์ํ, ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ํ์ฑํ ๋ ์ด ์ํ์ ๋๋ฌํ๋ฉฐ ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ ๋ช ๋ น์ด์ ๋ช ๋ น์ด ์ฌ์ด์ ๋ํ๋ ์ ์์
-
(COMMAND): ๋ช ๋ น์ด๋ฅผ ๋ํ๋ด๋ ์ํ, ํ์๊ฐ ๋ช ๋ น์ด ๋ถ๋ถ์ ํ์ฑํ ๋ ์ด ์ํ์ ๋๋ฌํ๋ฉฐ ๋ช ๋ น์ด๋ ์ถ๋ ฅ ๋ฆฌ๋ค์ด๋ ์ ์ฐ์ฐ์(>, >>) ๋๋ ๋ ผ๋ฆฌ ์ฐ์ฐ์(&&, ||) ๋๋ ํ์ดํ(|)๋ก ๋๋ ์ ์์
-
(END): ํ์์ ์ข ๋ฃ ์ํ, ํ์๊ฐ ๋ช ๋ น์ด๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ํ์ฑํ๊ณ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๋ง์น๋ฉด ์ด ์ํ๋ก ์ ํ๋๋ฉฐ ์ด ์ํ๋ ํ์ฑ ์์ ์ด ๋๋ฌ์์ ๋ํ๋
- ๋น์ ์ ์์:
- ์๋ก์ด ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ ์ ์๋
ํ๋กฌํํธ๋ฅผ ๋ณด์ฌ์ค์ผ ํฉ๋๋ค => readline - ์์
ํ์คํ ๋ฆฌ๋ฅผ ๊ฐ๊ณ ์์ด์ผ ํฉ๋๋ค. => add_history - (PATH ๋ณ์๋ ์๋, ์ ๋ ๊ฒฝ๋ก๋ฅผ ํ์ฉํ์ฌ) ์ฌ๋ฐ๋ฅธ ์คํ ํ์ผ์ ์ฐพ์ ์คํํ ์ ์์ด์ผ ํฉ๋๋ค. => parse, exceve
์ ์ญ๋ณ์๋ ํ ๊ฐ ์ด๊ณผ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ ์ ์ญ๋ณ์๋ฅผ ์ฌ์ฉํ๋์ง ๊น๊ฒ ์๊ฐํด ๋ณด๊ณ ๊ทธ ์ด์ ๋ฅผ ์ค๋ช ํ ์ ์์ด์ผ ํฉ๋๋ค. => shell ์ข ๋ฃ ์?- ๋ซํ์ง ์์ ๋ฐ์ดํ๋ ํน์ ๋์ง ์์ ํน์๋ฌธ์ (\๋ ; ๋ฑ...) ์ ํด์ํ์ง ์์์ผ ํฉ๋๋ค.
- ' (๋จ์ผ ๋ฐ์ดํ) ์์ ์๋ ๋ฉํ๋ฌธ์๋ฅผ ํด์ํ์ง ์์์ผ ํฉ๋๋ค.
- " (์ด์ค ๋ฐ์ดํ) ์์ ์๋ $ (๋ฌ๋ฌ ๊ธฐํธ)๋ฅผ ์ ์ธํ ๋ฉํ๋ฌธ์๋ฅผ ํด์ํ์ง ์์์ผ ํฉ๋๋ค.
- ์๋ก์ด ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ ์ ์๋
- ๋ค์์ ๋ฆฌ๋ค์ด๋ ์
์ ๊ตฌํํด์ผ ํฉ๋๋ค:
<๋ ์ ๋ ฅ์ ๋ฆฌ๋ค์ด๋ ์ ํ์ฌ์ผ ํฉ๋๋ค>๋ ์ถ๋ ฅ์ ๋ฆฌ๋ค์ด๋ ์ ํ์ฌ์ผ ํฉ๋๋ค<<์ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ์ง์ ํ ๋ค์, ํ์ฌ ์์ค์์ ๊ตฌ๋ถ์๋ฅผ ํฌํจํ ์ค์ ๋ง๋๊ธฐ ์ ๊น์ง ์ ๋ ฅ๊ฐ์ ์ฝ์ด๋ค์ ๋๋ค. ๊ธฐ๋ก์ ์ ๋ฐ์ดํธํ ํ์๋ ์์ต๋๋ค! => open(RDONLY)>>๋ ์ถ๋ ฅ์ ์ถ๊ฐ ๋ชจ๋๋ก ๋ฆฌ๋ค์ด๋ ์ ํฉ๋๋ค. => open(APPEND)
ํ์ดํ(|๋ฌธ์)๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค. ๊ฐ ํ์ดํ๋ผ์ธ๋ง๋ค ๋ช ๋ น์ด์ ์ถ๋ ฅ๊ฐ์ ํ์ดํ๋ก ์ฐ๊ฒฐ๋์ด ๋ค์ ๋ช ๋ น์ด์ ์ ๋ ฅ๊ฐ์ผ๋ก ๋ค์ด๊ฐ์ผ ํฉ๋๋ค. => pipexํ๊ฒฝ๋ณ์($๋ค์์ ๋ฌธ์์ด์ด ์ค๋ ํ์) ์ ๊ทธ๋ค์ ๊ฐ์ผ๋ก ํ์ฅ๋์ด์ผ ํฉ๋๋ค.$?๋ ๊ฐ์ฅ ์ต๊ทผ์ ์คํํ ํฌ๊ทธ๋ผ์ด๋ ํ์ดํ๋ผ์ธ์ ์ข ๋ฃ ์ํ๋ฅผ ํ์ฅํ์ฌ์ผ ํฉ๋๋คctrl-C,ctrl-D๊ทธ๋ฆฌ๊ณctrl-\๋ bash์ ๋์ผํ๊ฒ ๋์ํ์ฌ์ผ ํฉ๋๋ค.- ์ํธ์์ฉ์ด ๊ฐ๋ฅํ ๋:
ctrl-C๋ ์๋ก์ด ์ค์ ์๋ก์ด ํ๋กฌํํธ๋ฅผ ์ถ๋ ฅํฉ๋๋คctrl-D๋ ์์ ์ข ๋ฃํฉ๋๋ค.ctrl-\์ ์๋ฌด๋ฐ ๋์๋ ํ์ง ์์ต๋๋ค.
- ๋ค์์
๋ด์ฅ ๊ธฐ๋ฅ๋ค์ ์คํํ ์ ์์ด์ผ ํฉ๋๋ค:-n์ต์ ์ ์ฌ์ฉํ ์ ์๋echo- ์ค์ง ์๋ ๋๋ ์ ๋๊ฒฝ๋ก๋ง ์ฌ์ฉํ๋
cd=> chdir - ์ต์
์ด ์๋
pwd - ์ต์
์ด ์๋
export - ์ต์
์ด ์๋
unset - ์ต์
์ด๋ ์ธ์๊ฐ์ด ์๋
env - ์ต์
์ด ์๋
exit
readline()ํจ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ด๋ฅผ ๊ณ ์น ํ์๋ ์์ต๋๋ค. ํ์ง๋ง๋น์ ์ด ์ง์ ์์ฑํ ์ฝ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ผ์ผํฌ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๐ก ์ฌ๋ฌ๋ถ์ ๊ณผ์ ์ ์ค๋ช ์๋ง ๊ตญํ๋๋๋ก ์ค๊ณํด์ผ ํฉ๋๋ค. ์๊ตฌํ์ง ์์ ๊ฒ๋ค์ ๋ง๋์ค ํ์๋ ์์ต๋๋ค.
์๋ฌธ์ ์ด ์๊ธด๋ค๋ฉด bash๋ฅผ ์ฐธ๊ณ ํ์ธ์.
- ์ฌ๋ฌ๋ถ์ ํ๋ก๊ทธ๋จ์ ๋ค์์ ๊ตฌํํด์ผ ํฉ๋๋ค:
- ๊ดํธ๋ฅผ ์ด์ฉํด ์ฐ์ ์์๋ฅผ ํํํ
&&, || - ์์ผ๋์นด๋
*๊ฐ ํ์ฌ ์์ ๋๋ ํ ๋ฆฌ์ ๋ํด ๋์ํ์ฌ์ผ ํฉ๋๋ค.
- ๊ดํธ๋ฅผ ์ด์ฉํด ์ฐ์ ์์๋ฅผ ํํํ
๋ณด๋์ค๋ ํ์๋ก ๊ตฌํํด์ผ ํ๋ ํํธ๊ฐ ์๋ฒฝํ ๋๋ง ํ๊ฐ๋ ๊ฒ์ ๋๋ค. '์๋ฒฝํจ' ์ด๋, ๋ชจ๋ ํ์ ํํธ๊ฐ ์ ๋ถ ๊ตฌํ๋์ด ์์ด์ผ ํ๋ฉฐ ์ค์๋ํ๋ ๋ถ๋ถ์ด ์์ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ํ์๋ก ๊ตฌํํด์ผ ํ๋ ํํธ์์ ๋ง์ ์ ๋ฐ์ง ๋ชปํ๋ค๋ฉด, ๋ณด๋์ค ํญ๋ชฉ์ ์ฑ์ ๋์ง ์์ต๋๋ค.
ํ์คํ ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ clear_history() ํจ์์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ชจ๋ ํญ๋ชฉ์ ์ญ์ ํ์ฌ ํ์คํ ๋ฆฌ ๋ชฉ๋ก์ ์ง์๋๋ค. ์ด ํจ์๋ clear_history์ ๋ค๋ฅธ ์ ์ Readline์ด ํ์คํ ๋ฆฌ ๋ชฉ๋ก์ ์ ์ฅํ๋ ๋น๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ํด์ ํ๋ค๋ ์ ์ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ค ๋ฐ๊ฟ์ ์ถ๋ ฅํ ํ ์ ๋ฐ์ดํธ ํจ์์ ์ (๋น) ์ค๋ก ์ด๋ํ์์ ์๋ฆฝ๋๋ค.
rl_line_buffer์ ๋ด์ฉ์ ํ ์คํธ๋ก ๋ฐ๊ฟ๋๋ค. ๊ฐ๋ฅํ๋ฉด ํฌ์ธํธ์ ๋งํฌ๋ ์ ์ง๋ฉ๋๋ค. clear_undo๊ฐ 0์ด ์๋ ๊ฒฝ์ฐ ํ์ฌ ์ค๊ณผ ์ฐ๊ฒฐ๋ ์คํ ์ทจ์ ๋ชฉ๋ก์ด ์ง์์ง๋๋ค.
0์ด ์๋ ๊ฒฝ์ฐ ์ด ํฌ์ธํฐ๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก Readline์ ํธ์ถํ์ฌ ํธ์ง ๋ฒํผ์ ํ์ฌ ์ฝํ ์ธ ๋ก ๋์คํ๋ ์ด๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๊ฐ์ ๊ธฐ๋ณธ Readline ์ฌํ์ ํจ์์ธ rl_redisplay๋ก ์ค์ ๋์ด ์์ต๋๋ค(์ฌํ์ ์ฐธ์กฐ).