# minishell

[Minishell] minishell 구상
Minishell을 기록하며... 팀원과 함께 minishell을 만들며 있었던 여러 문제들을 기록하며 minishell을 정리하고 minishell과 minishell을 만들기 위해 알아야 하는 개념들을 정리 해보려 한다. Minishell 구상 bash와 비슷하게 동작하는 minishell을 만들기 위해서는 먼저 bash에 동작에 대해 알아야하고 그에 따라 bash manual과 추가적으로 gnu bash git을 clone하여 실제 code를 참고하여 동작의 순서와 방식을 파악하려는 시도를 하였다. minishell 전체의 flow chart는 다음과 같다. 
minishell 허용함수 정리
readline readline 함수는 터미널에서 한 줄을 읽고 반환합니다 이때 prompt를 프롬프트 앞쪽에 표시해줍니다 반환되는 문자열은 malloc으로 할당되었으므로 사용 후 free해주어야 합니다 반환되는 문자열은 개행이 포함되지 않은상태로 반환됩니다 const char *prompt : 프롬프트 창에 표시하고 싶은 메시지 반환값 : 읽어온 메시지 (개행 미포함) 줄이 비어있으면 NULL이 반환합니다 비어있지 않은 줄과 함께 EOF를 읽으면 줄 바꿈으로 처리됩니다 readline man rlclearhistory 히스토리 라이브러리의 clearhistory() 함수와 동일한 방식으로 모든 항목을 삭제하여 히스토리 목록을 지웁니다. 이 함수는 clearhistory와 다른 점은 Readline이 히스토리 목록에 저장하는 개인 데이터를 해제한다는 점
[minishell] 구현
Minishell > C를 활용해 bash의 일부분을 구현해보는 과제. 파트를 크게 5가지로 나누어 팀원인 jiwolee님과 각각 역할을 나누어 수행했습니다. 저는 tokenizer, built-in, signal, 특수문자 파트를 맡아 수행하였습니다. Minishell 구조 > tokenizer 환경변수처럼 해석이 필요한 문자를 해석하고 문자열을 의미있는 토큰으로 나누어 변환한 뒤 필요한 형태로 가공하여 parser로 전달한다. >> 이때 환경변수, 쌍따옴표, 홑따옴표, whitespace, 특수문자 등에 대한 처리를 잘 해주어야 이후 편하게 처리가 가능하다. > parser 토큰을 구조를 가진 구문트리(syntax tree)로 변환한다. → here-documantaion << executor 구문 트리에 맞게 명령을 실행한다. → redirection → pipe 생성 및 fork 자식프로세스 생성 → c
[minishell] Builtin 함수
Builtin 함수 cd > 현재 작업 디렉토리를 절대경로, 상대경로 등 을 사용해 이동시켜주는 명령어 > minishell 요구사항 옵션없이 절대, 상대경로만을 사용할 수 있어야함 예시 \> cd ../ 상위 디렉토리로 이동 \> cd ./ 현재 디렉토리로 이동 \> cd Home 디렉토리로 이동 \> cd~ Home 디렉토리로 이동 \> cd JJEON/minishell JJEON 디렉토리의 minishell 디렉토리로 이동 echo > 받은 인자들을 출력해주는 명령어, -n옵션 사용 시 줄바꿈을 출력하지않음 minishell 요구사항 -n 옵션만을 지원하는 echo 예시 \> echo > \> echo asd asd \> echo -n asd asd\> \> echo -n -n -n asd asd\> \> echo -nnn -n -n asd asd\> \> echo -n -nnn -nm asd -nm
[42Seoul] - minishell
1.무엇을 하는 과제인가? : bash나 zsh등과 같은 shell을 만드는 것이다.(*shell : kernel과 사용자간의 다리 역할을 한다고 생각하면 된다.) : bash를 기반으로 shell을 만든다. : 보통 minishell 프로젝트를 진행하면, 파싱과 실행부분 두단계로 나눠서 팀원과 역할을 분배를 한다. 둘다를 전부 각각 해보는 팀이 있고, 나눠서 하는 팀이 있는데 우리의 경우 내가 실행부분, 팀원이 파싱부분을 담당하였다. 파싱이 상대적으로 더 피곤하고 해야될 일이 많을 수 있다. 나는 실행부분도 나중에 되니 예외처리를 너무 많이 해야 되서 힘들었지만 그래도 pipe의 개념이라던지 리다이렉션을 어떤 식으로 bash에서 하는지 등을 알 수 있어서
[minishell] 시그널 처리
조건 > ctrl-C, ctrl-D and ctrl-\\ should have the same result as in bash. > ctrl-C, ctrl-D, ctrl-\\ 는 bash와 동일하게 동작하여야 합니다. > When interactive: > 상호작용이 가능할 때: > ctrl-C print a new prompt on a newline. > ctrl-C는 새로운 줄에 새로운 프롬프트를 출력합니다 ctrl-C는 cat, grep등으로 정지된 상태에서 ^C를 출력하고 줄바꿈뒤 새로운 프롬포트를 출력합니다 ctrl-C는 버퍼에 문자가 있는 상황에서는 버퍼를 지우고 새로운 프롬포트를 출력합니다 > ctrl-D exit the shell. > ctrl-D는
[minishell] 사용 가능 함수 정리
readline 인자 *str : 프롬포트에 출력할 문자열 기능 str을 출력하고 프롬포트에서 표준입력으로 문자열을 입력받고 입력된 문자열을 반환 입력이 완료되기 전 까지는 다음 코드로 진행되지않음 반환값 저장공간을 동적할당하고 입력받은 문자열을 저장하여 반환함 주의사항 -lreadline 라이브러리를 링크해주어야 함 반환받은 문자열은 사용 후 저장공간 할당을 해제해주어야 함 rlonnew_line 인자 없음 기능 알림형태 함수 readline 디렉토리에서 update관련 함수들에게 커서가 다음줄로 이동한것을 알려줌 반환값 성공시 0 에러시 -1 주의사항 -lreadline 라이브러리를 링크해주어야 함 rlreplaceline 인자 `*s
[minishell] minishell 이란
Minishell 닫히지 않은 따옴표나 특정되지 않은 특수문자 (\\나 ; 등...) 을 해석하지 않아야 합니다. 전역변수는 한 개 이상을 사용할 수 없으며, 왜 전역변수를 사용했는지 깊게 생각해 보고 그 이유를 설명할 수 있어야 합니다. 새로운 명령어를 입력할 수 있는 프롬프트를 보여줘야 합니다. 작업 히스토리를 갖고 있어야 합니다. (PATH 변수나 상대, 절대 경로를 활용하여) 올바른 실행 파일을 찾아 실행할 수 있어야 합니다. 다음의 내장 기능을 실행할 수 있어야 합니다: n 옵션을 사용할 수 있는 echo 오직 상대 또는 절대경로만 사용하는 cd 옵션이 없는 pwd
Minishell 사용가능한 외부 함수 정리
MINISHELL 사용가능한 외부 함수 readline 함수 원형 용도 readline은 char *prompt를 터미널에 띄워주고 터미널에서 입력된 문자열을 리턴함 CTRL + D 를 입력해도 EOF로 인식됨 Editing 방식에 따른 Key Binding을 지원하기 때문 매개변수 출력할 문자열 리턴 값 읽어들인 문자열을 리턴함(개행은 제거됨) 빈 문자열이라면 빈 문자열을 리턴함 값을 읽어내지 못하면 NULL을 리턴함(EOF) 리턴 값은 동적할당 된 것이므로 free()가 필요함(gnl과 비슷) 예제 https://wtg-study.tistory.com/103 rlonnew_line 함수원형 용도 readline 함수에 프롬프트가 개행문자를 만났다고 알려줌(알림 용도) 보통 개행을 출력 한 후, 시그널을 처리할 때 사용함 주로 rlreplaceline 및 rl_r

[42Seoul/minishell] bash 명령어 확인
기본 명령어 - echo echo는 backslash escape(\)를 만나도 문자 그대로 출력합니다. 기본적으로 개행이 들어가 있으나 -n옵션을 주게되면 개행하지 않습니다. - cd cd(change directory)는 주어진 상대 또는 절대 경로로 current working directory를 이동합니다. 만약 해당 디렉토리가 없다면 에러 메시지를 출력합니다. bash: cd: directory: No such file or directory 절대경로 절대경로는 루트디렉토리부터 이동할 목표 폴더까지 모든 경로를 다입력해서 이동하는 방법 입니다. 상대경로 상대경로는 내가 현재 소속된 디렉토리에서 목표 디렉토리로 바로 이동할 때 사용하는 방법 입니다. .: 현재 위치까지 경로 요약 ..: 상위 폴더로 한 단계 이동 현재 경로가 /home/desktop일 경우 `

[42Seoul/minishell] 사용 가능한 외부 함수 (7)
|사용 가능한 외부 함수| |:--------------| |readline, rlonnewline, rlreplaceline, rlredisplay, add_history, printf, malloc, free, write, open, read, close, pipe, fork, wait, waitpid, wait3, wait4, unlink, execve, dup, dup2, exit, signal, kill, getcwd, chdir, stat, lstat, fstat, opendir, readdir, closedir, strerror, errno, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs| getenv() name에 해당하는 환경 변수의 값에 대한 문자열

[42Seoul/minishell] 사용 가능한 외부 함수 (6)
|사용 가능한 외부 함수| |:--------------| |readline, rlonnewline, rlreplaceline, rlredisplay, add_history, printf, malloc, free, write, open, read, close, pipe, fork, wait, waitpid, wait3, wait4, unlink, execve, dup, dup2, exit, signal, kill, getcwd, chdir, stat, lstat, fstat, opendir, readdir, closedir, strerror, errno, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs| isatty() 파일 지정자가 터미널을 사용하는지 검사합니다.

[42Seoul/minishell] 사용 가능한 외부 함수 (5)
|사용 가능한 외부 함수| |:--------------| |readline, rlonnewline, rlreplaceline, rlredisplay, add_history, printf, malloc, free, write, open, read, close, pipe, fork, wait, waitpid, wait3, wait4, unlink, execve, dup, dup2, exit, signal, kill, getcwd, chdir, stat, lstat, fstat, opendir, readdir, closedir, strerror, errno, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs| opendir() 지정한 디렉토리 스트림을 엽니다. 특정 디렉토리 안에 있는

[42Seoul/minishell] 사용 가능한 외부 함수 (4)
|사용 가능한 외부 함수| |:--------------| |readline, rlonnewline, rlreplaceline, rlredisplay, add_history, printf, malloc, free, write, open, read, close, pipe, fork, wait, waitpid, wait3, wait4, unlink, execve, dup, dup2, exit, signal, kill, getcwd, chdir, stat, lstat, fstat, opendir, readdir, closedir, strerror, errno, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs| signal() 특정 시그널에 대해 수행할 동작을 정의하는데 사용됩니다. 시그널

[42Seoul/minishell] 사용 가능한 외부 함수 (3)
|사용 가능한 외부 함수| |:--------------| |readline, rlonnewline, rlreplaceline, rlredisplay, add_history, printf, malloc, free, write, open, read, close, pipe, fork, wait, waitpid, wait3, wait4, unlink, execve, dup, dup2, exit, signal, kill, getcwd, chdir, stat, lstat, fstat, opendir, readdir, closedir, strerror, errno, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs| unlink() 하드 링크를 끊는데 이용합니다. 하드 링크의 이름을

[42Seoul/minishell] 사용 가능한 외부 함수 (2) - 프로세스 생성 및 관리 함수
|사용 가능한 외부 함수| |:--------------| |readline, rlonnewline, rlreplaceline, rlredisplay, add_history, printf, malloc, free, write, open, read, close, pipe, fork, wait, waitpid, wait3, wait4, unlink, execve, dup, dup2, exit, signal, kill, getcwd, chdir, stat, lstat, fstat, opendir, readdir, closedir, strerror, errno, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs| 프로세스 생성 및 관리 함수 pipex과제를 진행하며 다뤘던 함수들이

[42Seoul/minishell] 사용 가능한 외부 함수 (1) - history 관리 함수
|사용 가능한 외부 함수| |:--------------| |readline, rlonnewline, rlreplaceline, rlredisplay, 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| history 관리 함수 아래 명령어를 통해 쉽게 설치할 수 있습니다.

[42-Seoul/minishell] 프로젝트 소개
사용 가능한 외부 함수 readline, rlonnewline, rlreplaceline, rlredisplay, 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 규칙 닫히지 않은 따옴표나 특정되지 않은 특수문자를 해석하지 않아야 합니다. 전역변수는 한 개 사용할 수 있습니다. 작업 히스토
minishell
bash의 기능을 C를 사용해 구현해야하는 과제인 minishell이다. 명령어 echo(n 옵션 포함), cd, pwd, export, unset, env, exit과 redirection , >>, pipe | 로 명령어의 출력값이 다음 명령어의 입력값으로 들어가야 하며 $?를 통한 foreground(종료 상태), ctrl+C, ctrl+D, ctrl+\ signal 등을 구현해야 했다. 하지만 위 내용을 구현하는 것 보다 입력 값을 parsing 하여 파이프와 redirection, 명령어, 옵션을 구분하는 것이 훨씬 까다롭고 중요했다. parse 내가 구현해낸 방법은 명령어를 받으면 PIPE(|)가 있는지 확인하고, 해당 PIPE를 기준으로 PIPE의 좌측 명령어와 우측 명령어

[minishell] 과제 정리
- minishell 과제를 마치고 내용을 정리하는 문서 minishell은 이름 그대로 나만의 작은 shell을 만드는 과제이다. bash를 기반으로 하여 shell을 만든다. 이 과제를 통해서 쉘의 동작 방식을 알아보고 구현할 수 있게 된다. 문제 해결을 위한 아이디어 minishell을 처음 시작할 때, 파싱 과정을 어떻게 할지에 대한 고민이 있었다. 이전의 ft_printf를 해결한 것처럼 앞에서부터 입력을 하나씩 읽고 코드를 리스트 형식으로 만드는 방법을 생각했다. 그러나, redirection이나 pipe, heredoc을 처리하는 데 일반적인 리스트는 복잡하다고 생각했다. 그래서 다른 방법을 찾아보았다. push_swap을 풀 때 많은 사람들이 문제 해결을 위해 quick sort을 사용했던 것으로 기억한다. minishell도 마찬가지로 많은 사람들이 사용하는 방법이 존재한다. 그것이 바로 AST(abstract syntax tree)이다.