Summary
이 프로젝트의 목표는 너로 하여금 단순한 셸(shell)을 만들게 하는 것이다. 작은 bash나 zsh를 말이다. 이를 통해 프로세스와 파일 디스크립터에 관해 많이 배우게 될 것이다.
Mandatory part
프로그램명 | minishell |
---|---|
제출할 파일 | - |
Makefile | 예 |
인자 | - |
외부 함수 | readline, rl_on_new_line, rl_replace_line, rl_redisplay, add_history, printf, malloc, free, write, open, read, close, fork, wait, waitpid, wait3, wait4, signal, kill, exit, getcwd, chdir, stat, lstat, fstat, unlink, execve, dup, dup2, pipe, opendir, readdir, closedir, strerror, errno, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs |
Libft 허용 여부 | 허용 |
설명 | 셸을 작성해라 |
너의 셸은 다음의 조건을 만족해야 한다.
- 닫히지 않은 따옴표나 명시되지 않은 특수문자(
\
또는;
)를 해석하지 않아야 한다. - 한 개 이상의 전역 변수를 사용해선 안된다. 또한 전역 변수를 사용한 이유에 대해 설명할 수 있어야 한다.
- 새로운 명령어를 기다리는 동안 프롬프트를 보여줘야 한다.
- 작업 내역(working History)을 가지고 있어야 한다.
- 올바른 실행파일은 검색하고 실행해야한다. (PATH 변수에 기반하거나 상대 경로나 절대 경로를 사용)
- 내장 함수(builtins)를 구현해야 한다.
- echo (-n 옵션)
- cd (상대 경로 또는 절대 경로)
- pwd (옵션 없음)
- export (옵션 없음)
- unset (옵션 없음)
- env (옵션 또는 인자 없음)
- exit (옵션 없음)
‘
은 일련의 문자에 대한 모든 해석을 금지한다.“
은$
를 제외한 일련의 문자에 대한 모든 해석을 금지한다.- 리다이렉션(redirection)
<
은 input을 리다이렉트한다.>
은 output을 리다이렉트한다.<<
은 현재 소스에서 줄에 구분자(delimeter)만이 존재할 때까지 입력을 읽어들인다. History를 갱신할 필요는 없다.>>
은 append 모드로 출력을 리다이렉트해야 한다.
파이프 파이프라인의 각 명령의 출력은 파이프를 통해 연결되어 다음 명령의 입력으로 들어간다. - 환경 변수(
$
뒤에 문자가 오는 형식)는 자신의 값으로 확장되어야 한다. $?
는 가장 최근에 실행된 foreground 파이프라인의 종료 상태(exit status)로 확장되어야 한다.ctrl-C
,ctrl-D
,ctrl-\
은 bash와 동일하게 동작해야 한다.- interactive할 때,
ctrl-C
는 새 프롬프트를 새 줄에 출력한다.crtl-D
는 셸을 나간다.ctrl-\
은 아무것도 하지 않는다.
- 이 외에 사항들은 구현할 필요가 없다.
의심스러운 부분이 있다면 bash를 참고해라.
Bonus part
- 필수 파트가 완벽하지 않다면 보너스는 생각하지도 마라.
- 괄호와 함께 있는
&&
,||
의 우선 순위 - 와일드카드
*
는 현재 작업중인 디렉토리에서 기능해야 한다.