쉘 만들기
요구사항
;
: commands에서 명령을 분리해야 한다 (bash와 같다)'
및 "
: 다중 행 명령을 제외하고 bash에서처럼 작동<
, >
, >>
: file descriptor aggregation을 제외하고 bash에서처럼 작동|
(파이프) : bash에서와 같이 작동c
, d
, \
: bash에서와 같이 작동-n
: 에코 후 개행하지 않음;
'
, "
(따옴표)
<
, >
, >>
리다이렉션 (redirection)
<
: 입력 리다이렉션
>
: 출력 리다이렉션
>>
: >
와 같지만 이미 파일이 존재하는 경우 append(데이터를 추가)한다
예
< words.text sort > words2.text
입력으로 words.text를 주고 sort후 words2.text로 출력한 모습
입력으로 words.text를 주고 sort후 기존의 words2.text에 append(추가)한 모습
|
(파이프)
두 명령문 사이의 수식막대를 지칭한다. 파이프는 쉘에게 왼쪽 명령문의 출력결과가 오른쪽 명령문의 입력값으로 사용된다라고 전달하는 역활을 한다
wc : “word count”의 축약어로 파일의 라인 수, 단어수, 문자수를 출력한다
왼쪽wc
명령문의 결과를|
를 통해 오른쪽head
명령문에 전달 해주고 거기서 -n개의 라인을 출력하는 모습
미니쉘 프로그램을 실행해서 명령을 받아서 처리하는 일련의 과정
개요
과정
')가 나올 때 까지 검색을 한다.3-1. 토큰의 경우가 여러가지이기 때문에 잘 살펴 보아야 합니다.
3-2. abcd
efgh -> 두개의 토큰 abcd, efgh 가 생깁니다.
3-3. abcd
efgh -> 상기 동일 (abcd, efgh)
3-4. 공백을 주의 해야 합니다!!! 공백은 아래 경우를 제외 하고 토큰문자에 포함될 수 없습니다.
3-4. “
, ’
안에 들어 있을 때
“”
hello world“”
->두개의 토큰 hello, world 가 생깁니다. 왜냐하면 “”
<- 하나가 토큰이 생성되고, “”
안에는 아무런 문자도 없기 때문에 빈 문자열이 생성되는데,빈 문자열은 토큰이 만들어 질 수 없습니다.“”
"hello world”
“”
마찬가지로 하나의 토큰이 생성 됩니다.‘hello world’
가 생성됩니다. dquote로 둘러 쌓여 있는 홑따옴표(squote라고 부르겠습니다.)를 주의 해야합니다.3-5. squote도 3-4-4를 포함하여 dquote를 포함한 규칙과 동일하게 작동합니다.
$
로 시작하는 문자열을 환경변수 목록과 비교하여 교체Abstract Syntax Tree - AST
// command line
/*
1. job ; command line
2. job ;
3. job
*/
// job
/*
1. command | job
2. command
*/
// command
/*
1. simple_command redirection_list
2. simple_command
*/
// redirection_list
/*
1. redirection redirection_list
2. empty
*/
// redirection
/*
1. > filename
2. < filename
3. >> filename
*/
// simple_command
/*
1. pathname token_list
*/
// token_list
/*
1. token token_list
2. empty
*/
cat > a > b < c
이 입력으로 들어온 경우
의미 : 입력값을 a에 넣겠다 -> b에 넣겠다 <- c의 내용을 넣겠다
결과 : a는 지워지고, c의 내용이 b에 들어간다. 여기서 a, b, c는 파일이름이며 모두 이미 존재해야한다
구현 : 파일 a를 parents로 잡고 리다이렉션 정보를 a노드에 넣어주고 좌측 노드에 simple cmd를, 오른쪽 노드에 <redirection list>
를 넣어주자
command
/ \
simple cmd redirection
/ \
cat >
/ \
aaaa >
/ \
bbbb <
/
cccc
AST로 나타낸 모습
(일단 보류)
/ \
cat >
/ \
aaaa >
/ \
bbbb <
/
cccc
AST로 나타낸 모습 2
(일단 보류)
/ \
cat aaaa (type : NODE_REDIRECT_IN)
\
bbbb (type: NODE_REDIRECT_IN)
\
cccc (type: NODE_REDIRECT_OUT)
AST로 나타낸 모습 3
aaaa (type : NODE_REDIRECT_IN)
/ \
cat bbbb (type: NODE_REDIRECT_IN)
\
cccc (type: NODE_REDIRECT_OUT)
로직
command를 두개의 구조로 중 하나로 확인한다
simple-cmd
와 redierection-list
구조simple-cmd
구조먼저 simple-cmd인지 확인하게되면
pathname
과 token-list
구조인지 확인하고pathname을 처리한 후, token-list구조에 대해서 둘중 하나인지 체크한다
token
과 token-list
구조EMPTY
1번의 token
과 token-list
구조라면 다시 재귀적으로 toekn, toekn-list를 확인하는 과정을 거치게 되고 그렇게 모든 토큰을 확인하면서 연결리스트를 만들게된다
redirection-list를 확인하게 되는 경우에는
redirection
과 redirection-list
구조EMPTY
중 하나의 경우를 확인하게 되고 (1)번의 경우 redirection에 대해서
> filename
< filename
>> filename
3가지의 경우를 체크해서 꺽쇠 정보와 filename정보를 받아서 노드를 생성하여 리스트에 추가해준다
이후에 redirection-list부분을 재귀적으로 다시 확인하면서 반복하게 된다