minishell
프로젝트는 유닉스 기반의 간단한 쉘을 구현하여 프로세스 생성, 파이프라인, 리다이렉션 등의 쉘 기능을 학습하는 데 목적이 있습니다. 특히, 다양한 파싱 함수를 통해 사용자의 명령어 입력을 처리하고 토큰화하는 방식을 구현했습니다.
minishell
은 bash와 같은 기본 쉘의 일부 기능을 직접 구현하는 프로젝트입니다. 이 프로젝트를 통해 명령어 실행 흐름과 쉘의 핵심 기능을 이해하며, 특히 파싱 기능을 통해 명령어 해석 방식을 설계하고 학습하게 됩니다.
이 프로젝트의 파싱 기능은 다음과 같은 단계로 나누어져 있으며, 명령어 입력을 해석하여 쉘에서 실행할 수 있는 구조로 변환합니다:
-
get_chunk
: 문자열 조각(Chunk)을 파싱하여 인용부호, 환경 변수, 텍스트 문자열 등을 분리해 추출합니다. 인용부호('
,"
)가 있을 경우 이를 확인하고, 환경 변수는get_chunk_str
을 통해 해석합니다. -
get_redirection
: 리다이렉션 기호(>
,<
,>>
,<<
,||
)를 파싱하여 처리합니다. 중복 기호를 확인하여 이중 리다이렉션을 해석하거나 단일 리다이렉션 토큰을 추가합니다. -
get_single_character
: 파이프(|
), 리다이렉션, 공백 등의 단일 문자를 개별 토큰으로 인식하고 처리합니다. -
parse_sequence
: 전체 입력 라인을 반복하여 각 문자에 대해 적절한 파싱 함수를 호출하여 명령어를 해석하는 메인 루프 역할을 합니다. -
parse
:parse_sequence
를 통해 해석된 명령어를 정리하고, 명령어 리스트와 리다이렉션 리스트를 최종적으로 생성합니다.
이러한 파싱 구조를 통해 입력 명령어를 효율적으로 처리하며, 쉘의 명령어와 토큰을 관리합니다.
- 입력 프롬프트: 사용자에게 쉘 프롬프트를 표시하고 명령어 입력을 받습니다.
- 기본 명령어 실행:
echo
,cd
,pwd
,export
,unset
,env
,exit
등의 기본 명령어를 처리할 수 있습니다. - 환경 변수 처리:
$
기호를 사용하여 환경 변수를 참조하거나 설정할 수 있습니다. - 파이프 지원:
|
연산자를 통해 여러 명령어를 파이프라인으로 연결하여 실행할 수 있습니다. - 리다이렉션 지원:
<
,>
,>>
와 같은 리다이렉션 연산자를 처리하여 입력과 출력을 파일로 리다이렉트할 수 있습니다. - 프로세스 관리: 외부 프로그램을 실행하기 위해
fork
,execve
등을 사용해 자식 프로세스를 생성하고 관리합니다.
- 프로세스 제어:
fork
와execve
를 사용해 자식 프로세스를 생성하고 명령어를 실행합니다. - 파이프라인:
pipe
시스템 호출을 통해 명령어의 출력을 다음 명령어의 입력으로 전달합니다. - 리다이렉션: 파일 디스크립터를 변경하여 입력/출력을 파일로 리다이렉트합니다.
- 환경 변수:
getenv
와setenv
를 사용해 쉘 환경 변수를 관리합니다. - 신호 처리:
SIGINT
,SIGQUIT
와 같은 신호를 처리하여 터미널 환경에 맞게 동작하도록 설정합니다.
- 프롬프트 표시: 사용자 입력을 기다리며 프롬프트를 표시합니다. 프롬프트는 환경 변수나 현재 디렉토리 정보를 포함할 수 있습니다.
- 명령어 해석: 사용자 입력을 파싱하여 명령어, 옵션, 인자를 구분합니다.
- 파이프라인 처리: 여러 명령어가
|
로 연결된 경우 각 명령어의 출력을 다음 명령어의 입력으로 설정하여 순차적으로 실행합니다. - 리다이렉션 처리:
<
: 파일에서 입력을 읽습니다.>
: 출력 결과를 파일에 덮어씁니다.>>
: 출력 결과를 파일에 추가합니다.
- 내장 명령어 처리:
cd
,echo
,exit
등 기본 명령어를 내부적으로 처리합니다. - 환경 변수 처리:
$
를 통해 참조되는 환경 변수를 처리하여 값으로 치환합니다.
-
터미널에서 이 저장소를 클론합니다.
git clone https://github.com/jmsmg/minishell.git cd minishell
-
프로젝트를 빌드합니다.
make
-
컴파일이 완료되면
minishell
실행 파일이 생성됩니다.
minishell
을 실행하면 프롬프트가 표시됩니다. 기본적인 쉘 명령어를 입력하여 테스트할 수 있습니다.
./minishell
minishell$ echo Hello, minishell!
Hello, minishell!
minishell$ pwd
/path/to/current/directory
cd <directory>
: 디렉토리 변경echo <text>
: 텍스트 출력export <key>=<value>
: 환경 변수 설정unset <key>
: 환경 변수 삭제env
: 환경 변수 목록 출력exit
: 쉘 종료