Skip to content

jmsmg/shell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

minishell

minishell 프로젝트는 유닉스 기반의 간단한 쉘을 구현하여 프로세스 생성, 파이프라인, 리다이렉션 등의 쉘 기능을 학습하는 데 목적이 있습니다. 특히, 다양한 파싱 함수를 통해 사용자의 명령어 입력을 처리하고 토큰화하는 방식을 구현했습니다.

목차

프로젝트 개요

minishell은 bash와 같은 기본 쉘의 일부 기능을 직접 구현하는 프로젝트입니다. 이 프로젝트를 통해 명령어 실행 흐름과 쉘의 핵심 기능을 이해하며, 특히 파싱 기능을 통해 명령어 해석 방식을 설계하고 학습하게 됩니다.

파싱 구조

이 프로젝트의 파싱 기능은 다음과 같은 단계로 나누어져 있으며, 명령어 입력을 해석하여 쉘에서 실행할 수 있는 구조로 변환합니다:

  1. get_chunk: 문자열 조각(Chunk)을 파싱하여 인용부호, 환경 변수, 텍스트 문자열 등을 분리해 추출합니다. 인용부호(', ")가 있을 경우 이를 확인하고, 환경 변수는 get_chunk_str을 통해 해석합니다.

  2. get_redirection: 리다이렉션 기호(>, <, >>, <<, ||)를 파싱하여 처리합니다. 중복 기호를 확인하여 이중 리다이렉션을 해석하거나 단일 리다이렉션 토큰을 추가합니다.

  3. get_single_character: 파이프(|), 리다이렉션, 공백 등의 단일 문자를 개별 토큰으로 인식하고 처리합니다.

  4. parse_sequence: 전체 입력 라인을 반복하여 각 문자에 대해 적절한 파싱 함수를 호출하여 명령어를 해석하는 메인 루프 역할을 합니다.

  5. parse: parse_sequence를 통해 해석된 명령어를 정리하고, 명령어 리스트와 리다이렉션 리스트를 최종적으로 생성합니다.

이러한 파싱 구조를 통해 입력 명령어를 효율적으로 처리하며, 쉘의 명령어와 토큰을 관리합니다.

기능

  • 입력 프롬프트: 사용자에게 쉘 프롬프트를 표시하고 명령어 입력을 받습니다.
  • 기본 명령어 실행: echo, cd, pwd, export, unset, env, exit 등의 기본 명령어를 처리할 수 있습니다.
  • 환경 변수 처리: $ 기호를 사용하여 환경 변수를 참조하거나 설정할 수 있습니다.
  • 파이프 지원: | 연산자를 통해 여러 명령어를 파이프라인으로 연결하여 실행할 수 있습니다.
  • 리다이렉션 지원: <, >, >>와 같은 리다이렉션 연산자를 처리하여 입력과 출력을 파일로 리다이렉트할 수 있습니다.
  • 프로세스 관리: 외부 프로그램을 실행하기 위해 fork, execve 등을 사용해 자식 프로세스를 생성하고 관리합니다.

사용된 개념

  • 프로세스 제어: forkexecve를 사용해 자식 프로세스를 생성하고 명령어를 실행합니다.
  • 파이프라인: pipe 시스템 호출을 통해 명령어의 출력을 다음 명령어의 입력으로 전달합니다.
  • 리다이렉션: 파일 디스크립터를 변경하여 입력/출력을 파일로 리다이렉트합니다.
  • 환경 변수: getenvsetenv를 사용해 쉘 환경 변수를 관리합니다.
  • 신호 처리: SIGINT, SIGQUIT와 같은 신호를 처리하여 터미널 환경에 맞게 동작하도록 설정합니다.

구현 세부 사항

  • 프롬프트 표시: 사용자 입력을 기다리며 프롬프트를 표시합니다. 프롬프트는 환경 변수나 현재 디렉토리 정보를 포함할 수 있습니다.
  • 명령어 해석: 사용자 입력을 파싱하여 명령어, 옵션, 인자를 구분합니다.
  • 파이프라인 처리: 여러 명령어가 |로 연결된 경우 각 명령어의 출력을 다음 명령어의 입력으로 설정하여 순차적으로 실행합니다.
  • 리다이렉션 처리:
    • < : 파일에서 입력을 읽습니다.
    • > : 출력 결과를 파일에 덮어씁니다.
    • >> : 출력 결과를 파일에 추가합니다.
  • 내장 명령어 처리: cd, echo, exit 등 기본 명령어를 내부적으로 처리합니다.
  • 환경 변수 처리: $를 통해 참조되는 환경 변수를 처리하여 값으로 치환합니다.

설치 방법

  1. 터미널에서 이 저장소를 클론합니다.

    git clone https://github.com/jmsmg/minishell.git
    cd minishell
  2. 프로젝트를 빌드합니다.

    make
  3. 컴파일이 완료되면 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: 쉘 종료

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published