minishell 총정리 / 근데 이제 subject랑 평가지를 곁들인!

    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 upctrl down으로 한 줄씩 이동하는 것도 좋습니다.

           : bash처럼 &&, || 등으로 괄호 우선순위를 부여합니다.

           : 와일드카드 *가 bash처럼 동작합니다.

    평가지

    TIP

    잠깐! 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 Ccat, grep(매개변수 없이)을 실행하여 block된 프롬프트에서 실행해 보세요.

    - ctrl \cat, grep(매개변수 없이)을 실행하여 block된 프롬프트에서 실행해 보세요.

    - ctrl Dcat, 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 와일드카드

    - 매개변수에 와일드카드를 사용하세요.

    - */* 처럼 사용해 보세요.

    - 자~ 자! 오늘 는! 와일드카드를 할거에요~ 미쳐벌랑 뽈롱!