๊ตฌํํด์ผํ๋ ์กฐ๊ฑด
ย
- ์๋ก์ด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ ์ ์๋ prompt๋ฅผ ๋ณด์ฌ์ค์ผ ํจ
- ์์ ํ์คํ ๋ฆฌ ๊ฐ์ง๊ณ ์๊ธฐ
- (PATH ๋ณ์๋ ์๋, ์ ๋ ๊ฒฝ๋ก๋ฅผ ํ์ฉํ์ฌ) ์ฌ๋ฐ๋ฅธ ์คํ ํ์ผ์ ์ฐพ์ ์คํํ ์ ์์ด์ผ ํจ
- ์ ์ญ๋ณ์ 1๊ฐ ( ์๋ง errno??)
- ๋ซํ์ง ์์ ๋ฐ์ดํ๋ \ ๋๋ ; ์ ํด์ํ์ง ์์์ผ ํจ
- ๋ด์ฅ๊ธฐ๋ฅ(builtins) ์คํํ์ฌ์ผ ํจ
echo
( -n ์ต์ ์ ํฌํจ )cd
( ์ ๋ ์๋๊ฒฝ๋ก๋ง)pwd
( ์ต์ X )export
( ์ต์ X )unset
( ์ต์ X )env
( ์ต์ X )exit
( ์ต์ X )
'
๋ ์ผ๋ จ์ ๋ฌธ์์ด์ ๋ํ ํด์์ ๊ธ์ง
"
๋ย$
๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ฌธ์์ด์ ๋ํ ํด์์ ๊ธ์ง
- ๋ฆฌ๋ค์ด๋ ์
<
์ ๋ ฅ ๋ฆฌ๋ค์ด๋ ์ >
์ถ๋ ฅ ๋ฆฌ๋ค์ด๋ ์ <<
๋ ํ์ฌ ์์ค์์ ๊ตฌ๋ถ์๋ฅผ ํฌํจํ ์ค์ ๋ง๋๊ธฐ ์ ๊น์ง ์ ๋ ฅ๊ฐ์ ์ฝ์ด๋ค์ธ๋ค. ๊ธฐ๋ก์ ์ ๋ฐ์ดํธํ ํ์๋ ์๋ค>>
์ถ๋ ฅ์ ์ถ๊ฐ ๋ชจ๋๋ก ๋ฆฌ๋ค์ด๋ ์
- ํ์ดํ
|
- ํ๊ฒฝ๋ณ์ ($ ๋ค์์ ๋ฌธ์์ด์ด ์ค๋ ํ์) ์ ๊ทธ๋ค์ ๊ฐ์ผ๋ก ํ์ฅ๋์ด์ผ ํจ
$?
๋ ๊ฐ์ฅ ์ต๊ทผ์ ์คํํ ํฌ๊ทธ๋ผ์ด๋ ํ์ดํ๋ผ์ธ์ ์ข ๋ฃ ์ํ๋ฅผ ํ์ฅํด์ผ ํจ
ctrl-C
,ยctrl-D
,ยctrl-\
ย ๋ bash์ ๋์ผํ๊ฒ ๋์ํด์ผํจ
ย
ํ์ฉ ํจ์ ์ ๋ฆฌ
ย
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๋ช
๋ น์ด๋ bash์ ๋น๊ตํด ๊ฐ๋ฉด์ ๊ณต๋ถํ๋ค๋ฉด ํฐ ๋์์ด ๋๋ค.
ํ์ฑ๋ถ
ํ ํฐํ
๋ค์๊ณผ ๊ฐ์ ํ ํฐํ๊ณผ์ ์ ๊ฑฐ์ณค๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํ ํฐํ๋ฅผ ์งํํ ๋๋ ํ ํฐํ๋ฅผ ํด์ผํ๋ ๊ตฌ๋ฌธ์ ์ผ์ชฝ๋ถํฐ ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ์งํํ๋ฉฐ ๋๋์ด ์ค๋ค. ํ ํฐํ๋ฅผ ํ ๋ ์์๊ฐ ์๋นํ ์ค์ํ๋ค๋ ์ ์ ์ ์ํ๋ฉด์ ํ ํฐํ๋ฅผ ํ์ฌ์ผ ํ๋ค. ์์์์ CHUNK ๋ {} ARGV ๋ [] ๊ทธ์ธ๋ ()์ผ๋ก ํํํ์ผ๋ ์ฐธ๊ณ ํ์.
typedef enum e_token_type { TOKEN_TYPE_CHUNK,// ํด์๋ ์ฌ์ง๊ฐ ์์ง ์กด์ฌํ๋ ๋จ๊ณ TOKEN_TYPE_ARGV,// ๋์ด์ ํด์ํ ์ ์๋ ๋จ๊ณ TOKEN_TYPE_SPACE,// ๋น์นธ TOKEN_TYPE_PIPELINE,// ํ์ดํ TOKEN_TYPE_REDIRECTION// ๋ฆฌ๋ค์ด๋ ์ } t_token_type;
์์ ๊ตฌ๋ฌธ) cat << $โUSERโ -e > a | echo โ$USERโ$USER
๋งจ์ฒ์์ ๋ค์ด์จ ๊ตฌ๋ฌธ์ ํ๋์ ํฐ chunk๋ก ๋ง๋ค์ด ์ฃผ๊ณ 7๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ ํ ํฐํ๋ฅผ ํด์ฃผ๋ฉด ๋๋ค.
- heredoc์์์ limiter ์ฒ๋ฆฌ
(CHUNK => CHUNK(<< ํฌํจ), ARGV(limiter), CHUNK)
heredoc์ limiter์ ๊ฒฝ์ฐ ํ๊ฒฝ๋ณ์ ํด์์ด ๋๋ฉด ์๋๊ณ quotes์ ๋ฌถ์ธ ์ ์ฒด๊ฐ limiter๊ฐ ๋๊ธฐ๋๋ฌธ์ ์ด๋ฅผ ๋จผ์ ํด์ํด์ค๋ค.
limiter๋ฅผ ์ ํ ๋์ ๊ธฐ์ค์ bash๋ฅผ ์ฌ์ฉํ์ฌ ํ์ธํด๋ณด์. ํน์ดํ ์ผ์ด์ค ๋ค์ด ์๋นํ ๋ง๋ค.
ํน์ดํ ์์)
cat << $USER (limiter: $USER)
cat << $USโERโ (limiter: $USER)
cat << $โUSERโ (limiter: USER)
ex)
{cat << }[USER]{ -e > a | echo โ$USERโ$USER}
- quotes ์ฒ๋ฆฌ
CHUNK => CHUNK, ARGV, CHUNK
โโ ์ โโ์ ์ฐจ์ด์ ์ ์ํ๋ฉฐ ์ฒ๋ฆฌํด ์ค๋ค.
ex)
{cat << }[USER]{ -e > a | echo }[$USER]{$USER}
- ํ๊ฒฝ๋ณ์ ์ฒ๋ฆฌ
CHUNK => CHUNK, ARGV, SPACE, ARGV, CHUNK
ex)
{cat << }[USER]{ -e > a | echo }[$USER]{}[jahlee]( )[]{}
- ๋น์นธ ์ฒ๋ฆฌ
ex)
CHUNK => CHUNK, BLANK, CHUNK
{cat}( ){<<}( ){}[USER]{}( ){-e}( ){>}( ){a}( ){|}( ){echo}( ){}[$USER]{}[jahlee]( )[]{}
- ํ์ดํ ์ฒ๋ฆฌ
CHUNK => CHUNK, PIPE, CHUNK
ex)
{cat}( ){<<}( ){}[USER]{}( ){-e}( ){>}( ){a}( )(|)( ){echo}( ){}[$USER]{}[jahlee]( )[]{}
- ๋ฆฌ๋ค์ด๋ ์ ์ฒ๋ฆฌ
CHUNK => CHUNK, REDIRECTION, CHUNK
ex)
{cat}( )(<<)( ){}[USER]{}( ){-e}( )(>)( ){a}( )(|)( ){echo}( ){}[$USER]{}[jahlee]( )[]{}
- ๋น CHUNK ํ ํฐ ์ญ์ ๋ฐ CHUNK๋ฅผ ARGV๋ก ๋ณํ
ex)
[cat]( )(<<)( )[USER]( )[-e]( )(>)( )[a]( )(|)( )[echo]( )[$USER][jahlee]( )[]
- ์ฐ์๋ ARGV ํ ํฐ ๋ณํฉ
ex)
[cat]( )(<<)( )[USER]( )[-e]( )(>)( )[a]( )(|)( )[echo]( )[$USERjahlee]( )[]
- SPACE ํ ํฐ ์ญ์
ex)
[cat](<<)[USER][-e](>)[a](|)[echo][$USERjahlee][]
ย
๋ฌธ๋ฒ์ฒดํฌ
์ด์ ์ ๊ณผ์ ์์ ํ ํฐํ๋ฅผ ๋ค ํ๊ฒ๋๋ค๋ฉด ๊ฒฐ๊ตญ์ ๋จ๋ ํ ํฐ์ ํ์
์ ARGV, PIPE, REDIRECTION 3๊ฐ์ง์ด๋ค.
PIPE์ ์๋ค์๋ ๋ฌด์กฐ๊ฑด ํ์ดํ๊ฐ ์๋ ๋ค๋ฅธ ํ์
์ ํ ํฐ์ด ์์ผํ๋ฉฐ,
REDIRECTION์ ๋ค์๋ ๋ฌด์กฐ๊ฑด ARGV๊ฐ ์์ด์ผ ํ๋ค.
cmd_list ๋ก ๋ณํ
์ด๋ ๊ฒ ๋๋์ด์ง ์ฐ๊ฒฐ๋ฆฌ์คํธ ํ ํฐ์ cmd_list๋ก ๋๋์ด์ฃผ๋ฉด๋๋ค.
typedef struct s_cmd { char **argv; t_redirection *redirection; int pipe[2]; struct s_cmd *prev; struct s_cmd *next; } t_cmd; typedef struct s_redirection { char *type; char *file; struct s_redirection *next; } t_redirection;
๋๋๋ ์กฐ๊ฑด๊ฐ์ ๊ฒฝ์ฐ์๋ ํ์ดํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ก์ด ๋
ธ๋๋ฅผ ์ด์ด์ฃผ๋ฉด ๋๊ณ , REDIRECTION๊ณผ ๊ทธ๋ค์ ARGV๋ง ๋ฐ๋ก redirection ๋ฆฌ์คํธ์ ์ฐ๊ฒฐ ์์ผ์ฃผ๋ฉด ๋๋ค.
๊ตฌ๋๋ถ
built_in
์๊ฐ๋ณด๋ค ๊ฐ๋จํ ๊ฒ ๊ฐ์ง๋ง ์์ธ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ณด๋ฉด ์ฝ๋๊ฐ ์ ์ ๋์ด๋๋ค.
๋ช๊ฐ์ง ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๋ค์ ์ ์ด๋์ง๋ง ๊ตฌํ์ ํด์ผํ ์ง ๋ง์์ผ ํ ์ง๋ ํ๋จ์ ์ํด๋ณด๊ณ ๊ตฌํํ์.
- OLDPWD ๋ ์ด์ ๊ฒฝ๋ก๋ฅผ ๋ค๊ณ ์๋ ํ๊ฒฝ๋ณ์์ด๋ค. export๋ก ํ์ธ๊ฐ๋ฅ. ํน์ดํ๊ฒ bash๋ฅผ ์คํ์ํค๊ณ ์์ง ๊ฒฝ๋ก๋ฅผ ์ด๋ํ ์ ์๋ค๋ฉด value๊ฐ์ด NULL ์ด๋ค. ๊ตฌํํ๊ณ ์ ํ๋ค๋ฉด ์ด๊ธฐ init์ค์ ์์ ๊ฐ์ ์ค์ ํด์ฃผ๊ณ cd ๋ก ์ด๋ํ ๋๋ง๋ค ์ด์ ๊ฒฝ๋ก๋ฅผ ๊ฐฑ์ ํด์ฃผ์ด์ผํ๋ค.
- SHLVL ์ ํ์ฌ ์์ ๊น์ด๊ฐ ์ด๋์ ๋์ธ์ง๋ฅผ ์๋ ค์ฃผ๋ ํ๊ฒฝ๋ณ์์ด๋ค. ํ๊ณ ๋ค์ด๊ฐ ์ ๋ก ํ๋์ฉ ์ปค์ง๋ ๊ฒ์ ํ์ธํด ๋ณผ ์ ์๋ค.
- echo -nnnnnnnn ๊ณผ๊ฐ์ด n์ด ์ฐ์์ผ๋ก ๋์จ๋ค๋ฉด echo -n๊ณผ ๊ฐ์ด ๋์ํ๋ค.
- exit์ ํ ๋ ์์์ exit code๋ฅผ ์ค ์๋ ์๋ค. ๋ํ ์๊ทธ๋์ ์ํ ์ข ๋ฃ์ ์ํ ์ข ๋ฃ ์ฝ๋๋ ์ ํ๋จํ๊ณ ์์ด์ผํ๋ค.
- export์ ๊ฒฝ์ฐ
- export a=aaa b=bbbb c=ccc ์ ๊ฐ์ด ์ฌ๋ฌ๊ฐ๋ฅผ ํ๋ฒ์ ํ ์ ๋ ์๋ค. unset๋ ์ ์ฌํ๋ค.
- key๋ ์ฒซ๋ฒ์งธ ๋ฌธ์๊ฐ ๋ฌด์กฐ๊ฑด ์ํ๋ฒณ ํน์ โ_โ์ฌ์ผ๋ง ํ๋ฉฐ ์ดํ ๋ฌธ์๋ค์ ์ซ์ ๋๋ ์ํ๋ฒณ ๋๋ โ_โ์ฌ์ผํ๋ค.
here_doc
๋ช
๋ น์ ์คํํ๊ธฐ์ ์ ์์ฐจ์ ์ผ๋ก here_doc์ ๋จผ์ ์คํ์์ผ์ฃผ์ด์ผ ํ๋ค. ํ์์ ๊ฒฝ์ฐ cmd_list์ ๋ช๋ฒ์งธ ๋ช
๋ น์ด์ธ์ง์ ๋ฐ๋ผ ์์ ํ์ด๋
ํ์ผ์ ๋ง๋ค์ด ์ฃผ์๋ค.(0.tmp, 1.tmp ๊ณผ๊ฐ์ด)
๋ช๊ฐ์ง ์์๋ค์ ์ฐธ๊ณ ํ์ฌ ๊ตฌํํ๊ธธ ๋ฐ๋๋ค.
ex)
cat << a << b << c << d ์ ๊ฒฝ์ฐ limiter๊ฐ ์์ฐจ์ ์ผ๋ก a b c d ๋ฅผ ํตํด here_doc์ด ์ข
๋ฃ๋๋ฉฐ ๊ฒฐ๋ก ์ ์ผ๋ก๋ ๋ง์ง๋ง here_doc๋ง ์ฌ์ฉ๋๋ค.
here_doc์ ํ๋ ๋์ค์ ์๊ทธ๋ ์ข
๋ฃ๋ฅผ ์ ๊ฒฝ์จ์ฃผ์ด์ผ ํ๋ฉฐ ์ด์๋ฐ๋ฅธ ์ข
๋ฃ์ฝ๋ ๋ํ ์ ๊ฒฝ์จ์ฃผ์.
๋จ์ผ cmd
๋จผ์ built_in์ด๋ผ๋ฉด ๋ถ๋ชจ ํ๋ก์ธ์ค์์ ์คํ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋นผ์ฃผ์ด์ ์คํ์์ผ์ค๋ค.
์ด์ธ์ ๊ฒฝ์ฐ๋ผ๋ฉด fork๋ฅผ ๋ ์ ์คํ์์ผ์ฃผ๋ฉด ๋๋ค.
๋ค์ค cmd
์ปค๋งจ๋์ ๊ฐ์๋งํผ, ์ฆ cmd_list๋ฅผ ์ํํ๋ฉฐ ๊ทธ๋งํผ fork๋ฅผ ๋ ์ค๋ค. ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ์ํด ๋ถ๋ชจํ๋ก์ธ์ค์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด ์ฃผ์๊ณ ์์์์๋ ๊ตฌ๋์ ์์ผ์ค๋ค.
static void wait_and_set_exit_status(pid_t pid, int cnt) { signal(SIGINT, SIG_IGN); waitpid(pid, &g_exit_status, 0); while (--cnt) wait(0); if (WIFSIGNALED(g_exit_status)) g_exit_status = 128 + WTERMSIG(g_exit_status); if (WIFEXITED(g_exit_status)) g_exit_status = WEXITSTATUS(g_exit_status); }
ย
ใทใ ์ค๋ ธํธ
- ulimit -n 10 // ํ์ผ๋์คํฌ๋ฆฝํฐ ์ ํ
- ./minishell | ./minishell
- << a << b << c << d
- e$a // export a=โcho hiโ
- โโ
- unset PATH && ./minishell
- sleep 5 | sleep 10 // ๋ณ๋ ฌ์ฒ๋ฆฌ์ธ์ง
- cat ํ๊ณ ์๊ทธ๋๋ค ํ์ธ
- ๋ฏธ๋์ ์ฌ๋ฌ๋ฒ ํค๊ณ ์๊ทธ๋ ํ์ธ
ย
ย
Loading Comments...