Skip to content
ingyulimPublic
forked from inno-aca/minishell

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

ย 
ย 

Latest commit

ย 

History

158 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

minishell

Table of contents

TODO

  • 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

Analyzing a subject

stateDiagram-v2
  [*] --> (START)
  (START) --> (FILENAME) : <, <<, (, command
  (FILENAME) --> (OPERATOR) : &&, ||, >, >>, ), |
  (OPERATOR) --> (COMMAND) : (, command
  (COMMAND) --> (END) : >, >>, ||, &&, |
  (END) --> [*] : exit, ctrl + D
Loading
  • [*]: Start state, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์˜คํ† ๋งˆํƒ€๊ฐ€ ์–ด๋А ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน๋ณ„ํ•œ ์ƒํƒœ

  • (START): ํŒŒ์„œ์˜ ์ดˆ๊ธฐ ์ƒํƒœ, ํŒŒ์„œ๊ฐ€ ํŒŒ์‹ฑ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ ์ฒ˜์Œ์— ์ด ์ƒํƒœ์— ์žˆ์Œ

  • (FILENAME): ํŒŒ์ผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ, ํŒŒ์„œ๊ฐ€ ํŒŒ์ผ ์ด๋ฆ„ ๋ถ€๋ถ„์„ ํŒŒ์‹ฑํ•  ๋•Œ ์ด ์ƒํƒœ์— ๋„๋‹ฌํ•˜๋ฉฐ ํŒŒ์ผ ์ด๋ฆ„์€ ์ž…๋ ฅ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์—ฐ์‚ฐ์ž(<, <<) ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” ๋ฌธ์ž์—ด ๋งํ•จ

  • (OPERATOR): ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž(&&, ||)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ, ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋ฅผ ํŒŒ์‹ฑํ•  ๋•Œ ์ด ์ƒํƒœ์— ๋„๋‹ฌํ•˜๋ฉฐ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋Š” ๋ช…๋ น์–ด์™€ ๋ช…๋ น์–ด ์‚ฌ์ด์— ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Œ

  • (COMMAND): ๋ช…๋ น์–ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ, ํŒŒ์„œ๊ฐ€ ๋ช…๋ น์–ด ๋ถ€๋ถ„์„ ํŒŒ์‹ฑํ•  ๋•Œ ์ด ์ƒํƒœ์— ๋„๋‹ฌํ•˜๋ฉฐ ๋ช…๋ น์–ด๋Š” ์ถœ๋ ฅ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์—ฐ์‚ฐ์ž(>, >>) ๋˜๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž(&&, ||) ๋˜๋Š” ํŒŒ์ดํ”„(|)๋กœ ๋๋‚  ์ˆ˜ ์žˆ์Œ

  • (END): ํŒŒ์„œ์˜ ์ข…๋ฃŒ ์ƒํƒœ, ํŒŒ์„œ๊ฐ€ ๋ช…๋ น์–ด๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ํŒŒ์‹ฑํ•˜๊ณ  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๋งˆ์น˜๋ฉด ์ด ์ƒํƒœ๋กœ ์ „ํ™˜๋˜๋ฉฐ ์ด ์ƒํƒœ๋Š” ํŒŒ์‹ฑ ์ž‘์—…์ด ๋๋‚ฌ์Œ์„ ๋‚˜ํƒ€๋ƒ„

  • developing-linux-based-shell

  • bash-parser

Mandatory

  • ๋‹น์‹ ์˜ ์‰˜์€:
    • ์ƒˆ๋กœ์šด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค => 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๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Bonus part


  • ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
    • ๊ด„ํ˜ธ๋ฅผ ์ด์šฉํ•ด ์šฐ์„ ์ˆœ์œ„๋ฅผ ํ‘œํ˜„ํ•œ &&, ||
    • ์™€์ผ๋“œ์นด๋“œ *๊ฐ€ ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•ด ๋™์ž‘ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณด๋„ˆ์Šค๋Š” ํ•„์ˆ˜๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ํŒŒํŠธ๊ฐ€ ์™„๋ฒฝํ•  ๋•Œ๋งŒ ํ‰๊ฐ€๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. '์™„๋ฒฝํ•จ' ์ด๋ž€, ๋ชจ๋“  ํ•„์ˆ˜ ํŒŒํŠธ๊ฐ€ ์ „๋ถ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์˜ค์ž‘๋™ํ•˜๋Š” ๋ถ€๋ถ„์ด ์—†์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ•„์ˆ˜๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ํŒŒํŠธ์—์„œ ๋งŒ์ ์„ ๋ฐ›์ง€ ๋ชปํ•œ๋‹ค๋ฉด, ๋ณด๋„ˆ์Šค ํ•ญ๋ชฉ์€ ์ฑ„์ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Allow functions

readline

rl_clear_history

ํžˆ์Šคํ† ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ clear_history() ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•˜์—ฌ ํžˆ์Šคํ† ๋ฆฌ ๋ชฉ๋ก์„ ์ง€์›๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” clear_history์™€ ๋‹ค๋ฅธ ์ ์€ Readline์ด ํžˆ์Šคํ† ๋ฆฌ ๋ชฉ๋ก์— ์ €์žฅํ•˜๋Š” ๋น„๊ณต๊ฐœ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์ œํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

rl_on_new_line

์ผ๋ฐ˜์ ์œผ๋กœ ์ค„ ๋ฐ”๊ฟˆ์„ ์ถœ๋ ฅํ•œ ํ›„ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜์— ์ƒˆ (๋นˆ) ์ค„๋กœ ์ด๋™ํ–ˆ์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

rl_replace_line

rl_line_buffer์˜ ๋‚ด์šฉ์„ ํ…์ŠคํŠธ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ํฌ์ธํŠธ์™€ ๋งˆํฌ๋Š” ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. clear_undo๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ ํ˜„์žฌ ์ค„๊ณผ ์—ฐ๊ฒฐ๋œ ์‹คํ–‰ ์ทจ์†Œ ๋ชฉ๋ก์ด ์ง€์›Œ์ง‘๋‹ˆ๋‹ค.

rl_redisplay

0์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์ด ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ Readline์„ ํ˜ธ์ถœํ•˜์—ฌ ํŽธ์ง‘ ๋ฒ„ํผ์˜ ํ˜„์žฌ ์ฝ˜ํ…์ธ ๋กœ ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๊ฐ’์€ ๊ธฐ๋ณธ Readline ์žฌํ‘œ์‹œ ํ•จ์ˆ˜์ธ 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

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages