Minishell
๐Ÿ™‰

Minishell

Created
Mar 22, 2023 05:52 AM
Last edited time
Last updated January 23, 2024
Tags
42
Language
C
URL
๐ŸคŽ
๋ฏธ๋‹ˆ์‰˜ ๋ƒ ๋ƒ 
๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ์กฐ๊ฑด
ย 
  1. ์ƒˆ๋กœ์šด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” prompt๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•จ
  1. ์ž‘์—… ํžˆ์Šคํ† ๋ฆฌ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ
  1. (PATH ๋ณ€์ˆ˜๋‚˜ ์ƒ๋Œ€, ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ํ™œ์šฉํ•˜์—ฌ) ์˜ฌ๋ฐ”๋ฅธ ์‹คํ–‰ ํŒŒ์ผ์„ ์ฐพ์•„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
  1. ์ „์—ญ๋ณ€์ˆ˜ 1๊ฐœ ( ์•„๋งˆ errno??)
  1. ๋‹ซํžˆ์ง€ ์•Š์€ ๋”ฐ์˜ดํ‘œ๋‚˜ \ ๋˜๋Š” ; ์€ ํ•ด์„ํ•˜์ง€ ์•Š์•„์•ผ ํ•จ
  1. ๋‚ด์žฅ๊ธฐ๋Šฅ(builtins) ์‹คํ–‰ํ•˜์—ฌ์•ผ ํ•จ echo ( -n ์˜ต์…˜์„ ํฌํ•จ ) cd ( ์ ˆ๋Œ€ ์ƒ๋Œ€๊ฒฝ๋กœ๋งŒ) pwd ( ์˜ต์…˜ X ) export ( ์˜ต์…˜ X ) unset ( ์˜ต์…˜ X ) env ( ์˜ต์…˜ X ) exit ( ์˜ต์…˜ X )
  1. '๋Š” ์ผ๋ จ์˜ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ํ•ด์„์„ ๊ธˆ์ง€
  1. "๋Š”ย $๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ํ•ด์„์„ ๊ธˆ์ง€
  1. ๋ฆฌ๋‹ค์ด๋ ‰์…˜ < ์ž…๋ ฅ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ > ์ถœ๋ ฅ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ << ๋Š” ํ˜„์žฌ ์†Œ์Šค์—์„œ ๊ตฌ๋ถ„์ž๋ฅผ ํฌํ•จํ•œ ์ค„์„ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€ ์ž…๋ ฅ๊ฐ’์„ ์ฝ์–ด๋“ค์ธ๋‹ค. ๊ธฐ๋ก์„ ์—…๋ฐ์ดํŠธํ•  ํ•„์š”๋Š” ์—†๋‹ค >> ์ถœ๋ ฅ์„ ์ถ”๊ฐ€ ๋ชจ๋“œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜
  1. ํŒŒ์ดํ”„ |
  1. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ($ ๋‹ค์Œ์— ๋ฌธ์ž์—ด์ด ์˜ค๋Š” ํ˜•์‹) ์€ ๊ทธ๋“ค์˜ ๊ฐ’์œผ๋กœ ํ™•์žฅ๋˜์–ด์•ผ ํ•จ
  1. $?๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์— ์‹คํ–‰ํ•œ ํฌ๊ทธ๋ผ์šด๋“œ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•จ
  1. 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๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์„œ ํ† ํฐํ™”๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  1. heredoc์—์„œ์˜ limiter ์ฒ˜๋ฆฌ
    1. (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}
  1. quotes ์ฒ˜๋ฆฌ
    1. CHUNK => CHUNK, ARGV, CHUNK
      โ€œโ€ ์™€ โ€˜โ€™์˜ ์ฐจ์ด์— ์œ ์˜ํ•˜๋ฉฐ ์ฒ˜๋ฆฌํ•ด ์ค€๋‹ค.
      ex)
      {cat << }[USER]{ -e > a | echo }[$USER]{$USER}
  1. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌ
    1. CHUNK => CHUNK, ARGV, SPACE, ARGV, CHUNK
      ex)
      {cat << }[USER]{ -e > a | echo }[$USER]{}[jahlee]( )[]{}
  1. ๋นˆ์นธ ์ฒ˜๋ฆฌ
    1. ex)
      CHUNK => CHUNK, BLANK, CHUNK
      {cat}( ){<<}( ){}[USER]{}( ){-e}( ){>}( ){a}( ){|}( ){echo}( ){}[$USER]{}[jahlee]( )[]{}
  1. ํŒŒ์ดํ”„ ์ฒ˜๋ฆฌ
    1. CHUNK => CHUNK, PIPE, CHUNK
      ex)
      {cat}( ){<<}( ){}[USER]{}( ){-e}( ){>}( ){a}( )(|)( ){echo}( ){}[$USER]{}[jahlee]( )[]{}
  1. ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์ฒ˜๋ฆฌ
    1. CHUNK => CHUNK, REDIRECTION, CHUNK
      ex)
      {cat}( )(<<)( ){}[USER]{}( ){-e}( )(>)( ){a}( )(|)( ){echo}( ){}[$USER]{}[jahlee]( )[]{}
  1. ๋นˆ CHUNK ํ† ํฐ ์‚ญ์ œ ๋ฐ CHUNK๋ฅผ ARGV๋กœ ๋ณ€ํ™˜
    1. ex)
      [cat]( )(<<)( )[USER]( )[-e]( )(>)( )[a]( )(|)( )[echo]( )[$USER][jahlee]( )[]
  1. ์—ฐ์†๋œ ARGV ํ† ํฐ ๋ณ‘ํ•ฉ
    1. ex)
      [cat]( )(<<)( )[USER]( )[-e]( )(>)( )[a]( )(|)( )[echo]( )[$USERjahlee]( )[]
  1. SPACE ํ† ํฐ ์‚ญ์ œ
    1. 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

์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด ์ฝ”๋“œ๊ฐ€ ์ ์  ๋Š˜์–ด๋‚œ๋‹ค.
๋ช‡๊ฐ€์ง€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ •๋ณด๋“ค์„ ์ ์–ด๋‘์ง€๋งŒ ๊ตฌํ˜„์„ ํ•ด์•ผํ• ์ง€ ๋ง์•„์•ผ ํ• ์ง€๋Š” ํŒ๋‹จ์„ ์ž˜ํ•ด๋ณด๊ณ  ๊ตฌํ˜„ํ•˜์ž.
  1. OLDPWD ๋Š” ์ด์ „ ๊ฒฝ๋กœ๋ฅผ ๋“ค๊ณ ์žˆ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜์ด๋‹ค. export๋กœ ํ™•์ธ๊ฐ€๋Šฅ. ํŠน์ดํ•˜๊ฒŒ bash๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ์•„์ง ๊ฒฝ๋กœ๋ฅผ ์ด๋™ํ•œ ์  ์—†๋‹ค๋ฉด value๊ฐ’์ด NULL ์ด๋‹ค. ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ดˆ๊ธฐ init์„ค์ •์—์„œ ๊ฐ’์„ ์„ค์ •ํ•ด์ฃผ๊ณ  cd ๋กœ ์ด๋™ํ• ๋•Œ๋งˆ๋‹ค ์ด์ „ ๊ฒฝ๋กœ๋ฅผ ๊ฐฑ์‹ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.
  1. SHLVL ์€ ํ˜„์žฌ ์‰˜์˜ ๊นŠ์ด๊ฐ€ ์–ด๋Š์ •๋„์ธ์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜์ด๋‹ค. ํƒ€๊ณ  ๋“ค์–ด๊ฐˆ ์ˆ˜ ๋ก ํ•˜๋‚˜์”ฉ ์ปค์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  1. echo -nnnnnnnn ๊ณผ๊ฐ™์ด n์ด ์—ฐ์†์œผ๋กœ ๋‚˜์˜จ๋‹ค๋ฉด echo -n๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.
  1. exit์„ ํ• ๋•Œ ์ž„์˜์˜ exit code๋ฅผ ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋˜ํ•œ ์‹œ๊ทธ๋„์— ์˜ํ•œ ์ข…๋ฃŒ์— ์˜ํ•œ ์ข…๋ฃŒ ์ฝ”๋“œ๋„ ์ž˜ ํŒ๋‹จํ•˜๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค.
  1. export์˜ ๊ฒฝ์šฐ
    1. export a=aaa b=bbbb c=ccc ์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ํ•œ๋ฒˆ์— ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค. unset๋„ ์œ ์‚ฌํ•˜๋‹ค.
    2. 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); }
ย 


ใ„ทใ…”์Šค๋…ธํŠธ
  1. ulimit -n 10 // ํŒŒ์ผ๋””์Šคํฌ๋ฆฝํ„ฐ ์ œํ•œ
  1. ./minishell | ./minishell
  1. << a << b << c << d
  1. e$a // export a=โ€cho hiโ€
  1. โ€œโ€
  1. unset PATH && ./minishell
  1. sleep 5 | sleep 10 // ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ์ธ์ง€
  1. cat ํ•˜๊ณ  ์‹œ๊ทธ๋„๋“ค ํ™•์ธ
  1. ๋ฏธ๋‹ˆ์‰˜ ์—ฌ๋Ÿฌ๋ฒˆ ํ‚ค๊ณ  ์‹œ๊ทธ๋„ ํ™•์ธ
ย 
ย 

Loading Comments...