Minishell 과제 해석
Minishell
Shell처럼 아름답습니다
요약:
이 프로젝트의 목적은 간단한 Shell을 만드는 것입니다. 네, 당신의 작은 bash와 zsh요. Process와 File descripter에 대해 많이 배우실 거에요!
목차
I | 소개 |
II | 일반 지침 |
III | 필수 파트 |
IV | 뽀오너스 파트 |
Chapter I : 소개
Shell의 존재는 IT에 있어 매우 중요하게 연결되어 있습니다.
옛날 코더들은 정렬된 1/0 스위치를 사용해 컴퓨터와 통신하는 게 매우 불편하다고 생각했습니다.
영어에 가까운 대화형 명령어를 사용하여 컴퓨터와 통신하는것은 매우 논리적이었습니다.
-> 미니쉘과 함께라면, 시간 여행을 통해
Windows가 존재하지 않었던 때의 프로그래머들이 직면했던 문제와 마주칠 수 있을겁니다.
Chapter II : 일반 지침
프로젝트는 Norm을 지켜야 합니다.
보너스 파일/함수들이 있다면 Norm 체크가 되어야 합니다. 안 되면 0점이구요!
함수는 정의되지 않은 행동으로 인한 예상치 못한 종료가 없어야 합니다.
(seg fault, bus error, double free, 등)
만약 발생한다면, 당신의 함수는 비기능적이라고 고려되며 0점을 받게 됩니다!
모든 할당된 힙 메모리 공간은 필요에 따라 해제되어야 합니다.
메모리 누수는 용냡되지 않아요!
서브젝트가 필요로 한다면, -Wall -Wextra -Werror를 이용해
소스 코드를 필요한 출력물로 생성하는 Makefile을 제출해야 합니다.
물론, Makefile은 Re-Link되지 않아야 하구요.
Makefile은 $(NAME), all, clean, fclean, re를 포함해야 합니다.
프로젝트에 보너스 항목을 넣기 위해선 Makefile에 bonus라는 규칙을 넣어야 합니다.
이 bonus는 메인 파트에서는 사용할 수 없는 헤더, 라이브러리 또는 함수를 저장합니다. (보너스 > 메인)
보너스 항목들은 반드시 ~~~_bonus.{c/h}라는 다른 파일에 분리되어야 합니다.
다시 말씀드리지만, 필수 파트의 항목들과 반드시 구별하세요!
프로젝트에서 libft를 사용할 수 있는 경우, 소스 및 관련 Makefile을 관련 libft 폴더에 복사해야합니다.
프로젝트의 Makefile은 라이브러리를 컴파일 한 다음 프로젝트를 컴파일해야합니다.
과제에 대한 테스트 프로그램을 만드는 것을 권장합니다!
비록 서브젝트에서 그걸 필요로 하지 않는다 해도요.
당신과 동료의 작업물을 평가하는데 많은 도움을 줄 거에요. 특히 defence할 때요!
물론 평가 중엔 테스터를 마음껏 사용해도 됩니다.
과제물을 git 저장소에 Submit하세요. 그곳에 있는 파일만 평가될 겁니다.
Deepthought도 동료 평가 이후에 평가할 겁니다.
만약 한 섹션에서라도 문제가 발생한다면, 평가는 멈춥니다.
Chapter III : 필수 파트
프로그램명 | minishell |
들어가는 파일들 | _ |
Makefile | 네! |
외부 함수들 | printf, malloc, free, write, open, read, close, fork, wait, waitpid, wait3, wait4, signal, kill, exit, getcwd, chdir, stat, lstat, fstat, execve, dup, dup2, pipe, opendir, readdir, closedir, strerror, errno, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs |
당신의 쉘이 해야 하는 것들:
- 전역변수를 하나 이상 사용하지 마세요.
전역변수를 사용한다면 그 이유에 대해 생각해 보고 설명할 준비가 되어 있어야 합니다.
- 다음 명령어를 기다리는 동안 prompt를 띄워주세요.
- bash 처럼 실제 실행 가능하게 만드세요. (PATH 변수 기반 또는 상대/절대 경로 사용)
- 다음의 항목들을 bash처럼 구현하세요.
: echo (-n 옵션도 함께)
: cd (절대/상대 경로로)
: pwd (다른 옵션 없이)
: export (다른 옵션 없이)
: unset (다른 옵션 없이)
: env (다른 옵션이나 다른 인자 없이)
: exit (다른 옵션 없이)
- ;는 명령어를 구분해야 합니다.
- '와 "는 여러 줄 명령어를 제외하고 bash와 같게 동작해야 합니다.
- 리다이렉션 <> ">>"는 파일 설명자 집계를 제외하고 bash처럼 동작해야 합니다.
- 파이프 |는 bash처럼 동작해야 합니다.
- 환경변수($는 문자처럼 사용)는 bash처럼 동작해야 합니다.
- $?는 bash처럼 동작해야 합니다.
- ctrl C, ctrl D, ctrl \는 bash와 같은 결과가 나와야 합니다.
Chapter IV : 보너스 파트
- 만약 필수 파트가 완벽하지 않다면 이 부분에 대해 생각도 하지 마세요!
- 모든 보너스를 할 필요는 없습니다.
- 리다이렉션 "<<"는 bash처럼 동작해야 합니다.
- history와 line editing은 Termcaps로 더 발전합니다.
(당신은 반드시 허용된 함수만 사용해야 합니다!)
: 커서가 위치한 곳의 라인을 수정할 수 있어야 합니다.
: 커서를 left, right를 눌러 특정 위치로 이동할 수 있어야 합니다.
기존의 쉘과 유사하게 기존 문자 사이에 새 문자를 삽입해야 합니다.
: 잘라내기, 복사하기, 붙여넣기가 모든 파트에서 알맞게 작동해야 합니다.
: ctrl left, ctrl right를 눌러 단어 단위로 이동할 수 있어야 합니다.
: home, end키로 줄의 처음과 끝으로 한 번에 이동할 수 있어야 합니다.
: 쓰기, 수정하기가 여러 라인에 걸쳐 작동해야 합니다.
이런 경우에는 ctrl up과 ctrl down으로 한 줄씩 이동하는 것도 좋습니다.
: bash처럼 &&, || 등으로 괄호 우선순위를 부여합니다.
: 와일드카드 *가 bash처럼 동작합니다.
평가지
잠깐! 42wiki/미니쉘수동테스트를 확인하세요.
Mandatory Part 필수 파트
Simple Command & Global 간단한 명령 & 전역변수
- 절대 경로로 옵션 없이 간단한 명령어를 실행하세요. (예를 들면: /bin/ls)
- 얼마나 많은 전역 변수를 사용했나요? 왜요? 구체적인 예를 들어 왜 필요한지 논리적을 설명하세요.
Arguments 매개변수
- 절대 경로로 옵션 없이 간단한 명령어를 실행하세요. (예를 들면: /bin/ls)
"와 '를 제외한 매개변수를 사용해야 합니다.
- 다른 매개변수로 여러 번 반복해 보세요!
echo
- 매개변수 없을 때, 있을 떄 모두 실행해 보세요.
- 다른 입력값으로 여러번 반복하세요!.
exit
- 매개변수 없을 때, 있을 떄 모두 실행해 보세요.
- 다른 입력값으로 여러번 반복하세요!.
- 물론 다시 실행하는것도 잊지 마시구요.
Return value of a process 프로세스의 리턴값 ($?)
- /bin/ls 같은 단순한 명령어를 매개변수(", ' 제외)와 함께 실행해 보세요.
실행한 후 echo $?를 실행해 보세요.
- 출력된 값을 확인하세요. bash에서도 똑같이 작동되는지 확인해 보세요.
- 여러 번 다른 명령어와 매개변수를 사용하고, 잘못된 명령어도 사용해 보세요.
예를 들면: /bin/ls filethatdoesnotexist
kkim의 각주: $? 실행 시 나는 숫자는 에러 코드에 대해서 공부해보면 알 수 있을 듯 하다..
Semicolons 세미콜론 (;)
- 여러 단순한 명령어(절대 경로 명령어 사용)를 매개변수 없이, ;으로 분리하여 사용해 보세요.
kkim의 예시: /bin/ls;/bin/pwd
kkim의 주의: ;으로 명령어를 분리할 때, 병렬 실행인지 아닌지에 대한 논란이 있습니다.
cat ; pwd를 실행시켜 보고 생각해 보세요. bash에서도요!
- 여러번 테스트하세요. 다른 명령어, 매개변수로! 세미콜론 주변 띄어쓰기를 없애보는 것도 잊지 마시구요.
Signals 시그널
- ctrl C를 빈 프롬프트에서 실행해 보세요.
- ctrl \를 빈 프롬프트에서 실행해 보세요.
- ctrl D를 빈 프롬프트에서 실행해 보세요.
- ctrl C를 뭘 좀 써 놓은 프롬프트에서 실행해 보세요.
- ctrl \를 뭘 좀 써 놓은 프롬프트에서 실행해 보세요.
- ctrl D를 뭘 좀 써 놓은 프롬프트에서 실행해 보세요.
- ctrl C를 cat, grep(매개변수 없이)을 실행하여 block된 프롬프트에서 실행해 보세요.
- ctrl \를 cat, grep(매개변수 없이)을 실행하여 block된 프롬프트에서 실행해 보세요.
- ctrl D를 cat, grep(매개변수 없이)을 실행하여 block된 프롬프트에서 실행해 보세요.
- 다른 명령어로 몇번 반복!
Double Quotes 쌍따옴표
- 이번엔 간단한 절대 경로 명령어를 매개변수와 함께 실행해 보세요.
그런데 이제 쌍따옴표(안에 세미콜론, 띄어쓰기 등을 넣어야 합니다)를 곁들인
- 비어있는 매개변수, \의 잘못된 사용에 대해서도 생각해 보세요.
- 멀티라인 string은 하지 마세요.
env
- 실제 환경 변수를 출력하나 확인해 보세요.
export
- 환경 변수를 수정, 추가해 보세요.
- env로도 체크해 보세요!.
kkim의 주의: 평가표에는 적혀 있지 않지만 아무 매개변수도 입력하지 않으면 declare -x라는 메시지와 함께 환경변수 리스트를 출력합니다. 근데.. env와 정렬 방식이 다른..
unset
- 이건 오류인가..? 환경 변수를 수정, 추가해 보세요.
- unset으로 일부를 삭제해 보세요.
- env로 결과를 확인해 보세요! (export로도 확인 가능 ㅎ)
Environment Variables 환경 변수들
- echo를 통해 $환경변수를 출력해 보세요.
- bash처럼 ""로 둘러싸여 있어도 작동하는지 확인하세요.
kkim의 주의: '' 안에서는 작동하지 않으나, ""로는 작동합니다. $ 후에는 empty character가 올 때까지 확인하며, 첫번째 글자는 알파벳, 뒤 글자는 알파벳+숫자가 가능합니다. 그렇다면 $ 앞에 문자가 있다면..?
cd
- cd 명령어를 사용하여 작업 디렉토리를 이동해 보세요.
/bin/ls로 알맞은 디렉토리에 있는지도 확인하구요.
- 동작하거나 동작하지 않는(잘못된) 디렉토리도 넣어서 여러번 확인하세요.
- .과 ..도 확인하세요.
pwd
- pwd 명령어를 사용하세요.
- 여러번, 또 다른 디렉토리에서도 사용해 보세요.
Relative Path
- 상대 경로로 명령어를 실행해 보세요.
- 다른 디렉토리에서 복잡한 경로로 여러번 실행하세요.
Simple Quotes 작은따옴표 (')
- 매개변수에 작은따옴표를 넣어 실행해 보세요.
- 빈 매개변수도 테스트해 보세요.
- 환경변수, 공백, 세미콜론도 테스트해 보세요. (작동 안해야됨)
Redirection 리다이렉션
- 명령어를 리다이렉션과 함께 사용해 보세요. <, >.
- 여러 번 다른 명령어와 매개변수로 테스트해보세요. 어떨때는 >와 >>도!
- 같은 리다이렉션을 여러번 반복할 지 실패하는지 확인하세요.
Pipes 파이프
- cat file | grep bla | more등과 같이 파이프를 넣어 테스트해 보세요.
- 여러 번 다른 명령어와 매개변수로 테스트해보세요
- 잘못된 명령어 ls filethatdoesnotexist | grep bla | more같이 잘못된 명령어도 테스트!
Go Crazy and history 가서 미쳐보자구요! 그리고 히스토리..
- up, down을 통해 히스토리를 안내할 수 있는지 확인하세요. 여러번!
- 작동하지 않는 명령어 (ex: dsbksdgbksdghsd) 등을 입력해 보고, 쉘이 크래시나지 않는다면 에러를 출력해 보세요.
- 정말정말정말정말 긴 명령어와 매개변수를 테스트해보세요.
- ...아름다운 미니쉘과 즐거운 시간을 보내시길 바랍니다...
Bonus 뽀오오오오오너스
필수 파트가 완벽할때만 보너스 파트를 확인합니다. "처음부터 끝까지"!
double left redirection <<
<<가 잘 작동하는지 확인하세요.
Line editing 라인 수정
0(fail)부터 5(excellent)까지
- left, right를 눌러 이동하는지, 삽입 삭제 등도 잘 작동하나요?
- 복붙이 어디서 사용하든지 잘 작동하나요?
- ctrl left, ctrl right를 눌러 단어 별로 이동하나요?
- home, end를 눌러 문장의 처음과 끝으로 이동하나요?
- 여러 줄에 걸쳐 작동하나요?
And, Or &&, ||
0(fail)부터 5(excellent)까지
- &&와 ||를 사용하는 것이 bash처럼 작동하는지 확인하세요.
- 작동하는 flag마다 1점!
- 모든 플래그가 작동한다면 1보너스!
Wildcard 와일드카드
- 매개변수에 와일드카드를 사용하세요.
- */* 처럼 사용해 보세요.
- 자~ 자! 오늘 는! 와일드카드를 할거에요~ 미쳐벌랑 뽈롱!
Comment