이 프로젝트는 Bash를 참고하여 POSIX shell을 구현합니다.
왼쪽 : minishell
오른쪽 : zsh
minishell을 컴파일 하기 위해 GNU의 라이브러리인 readline이 필요합니다.
mac OS
brew install readline@8.1
linux
sudo apt install libreadline-dev
arm64 아키텍쳐에서는 rl_replace_line() 함수가 제대로 동작하지 않을 수 있습니다. 해당 함수를 주석처리 하면 프로그램이 정상적으로 컴파일 됩니다.
루트에 (all, clean, fclean, re)규칙을 제공하는 Makefile이 있습니다. 이를 통해 소스 코드를 컴파일 하여 minishell프로그램을 생성합니다.
make all
minishell프롬프트 실행
./minishell
- 쉘의 전체 흐름은 다음과 같습니다:
사용자 입력에서 환경 변수 확장 -> 확장된 입력 토큰화 -> 실행. - 멀티 파이핑, 멀티 리디렉션 가능.
- Heredoc은 입력에서 중복될 수 없습니다.
- $? 사용 가능.
- 사용자 입력의 quotes 처리, 리디렉션, 파이프가 제대로 형성되지 않은 경우 구문 오류 발생.
\,;등의 특수 문자는 지원되지 않지만\\는 파일 이름으로 사용할 수 있음.- Ctrl + C, Ctrl + D, Ctrl + \는 Bash와 동일하게 구현.
- Readline 라이브러리를 사용하여 vim과 같은 편집 지원.
add_history함수를 사용한 히스토리 관리. 따라서 키보드의 화살표 키를 사용할 수 있음.- 여러 내장 명령어가 구현됨. (
echo,cd,pwd,export,unset,env,exit)
openon <unistd.h>closeon <unistd.h>readon <unistd.h>writeon <unistd.h>unlinkon <unistd.h>forkon <unistd.h>dupon <unistd.h>dup2on <unistd.h>pipeon <unistd.h>execveon <unistd.h>getcwdon <unistd.h>chdiron <unistd,h>isattyon <unistd.h>ttynameon <unistd.h>ttysloton <unistd.h>errnoon <errno.h>printfon <stdio.h>strerroron <string.h>mallocon <stdlib.h>freeon <stdlib.h>getenvon <stdlib.h>exiton <stdlib.h>killon <signal.h>signalon <signal.h>opendiron <dirent.h>closediron <dirent.h>readdiron <dirent.h>tcgetattron <term.h>tcsetattron <term.h>tgetenton <term.h>tgetflagon <term.h>tgetnumon <term.h>tgetstron <term.h>tgotoon <term.h>tputson <term.h>ioctlon <sys/ioctl.h>wait3on <sys/wait.h>wait4on <sys/wait.h>waiton <sys/wait.h>waitpidon <sys/wait.h>staton <sys/stat.h>lstaton <sys/stat.h>fstaton <sys/stat.h>readlineon <readline/readline.h>rl_on_new_lineon <readline/readline.h>rl_replace_lineon <readline/readline.h>rl_redisplayon <readline/readline.h>add_historyon <readlien/history.h>