-
Notifications
You must be signed in to change notification settings - Fork 0
built in 함수 구현
jeongmin edited this page Jan 9, 2023
·
1 revision
#include "builtin.h"
int ft_echo(char **argv);
- -n 옵션(개행출력 x)까지 구현
- 모든 출력은 표준출력에 출력
구현기능
-
echo
: 아무 인자도 안주어졌을 때 개행만 출력 -
echo -nnnnnnnn
: 옵션에 n이 여러개 들어왔을 경우 옵션 하나로 처리 -
echo -nnnnnnna
: 옵션 부분에 다른 문자가 껴있을 경우 문자열로 취급 -
echo aaa -nn
: 옵션 부분이 첫번째 인자가 아닐 시 문자열로 취급 -
echo aaa aaa
: 인자 사이에 개행이 많더라도 출력 시 사이엔 공백 하나만 출력
반환값
- argv가 NULL이거나 argv[0]이 NULL인 경우 -1 반환
- 이외의 경우 0 반환
#include "builtin.h"
int ft_pwd(char **argv);
- 현재 프로그램의 위치를 표준출력에 출력
- argv는 무시됨
반환값
- getcwd 함수 호출 실패 시 -1 반환
- 이외의 경우 0 반환
#include "builtin.h"
int ft_cd(char **argv);
- 현재 프로그램의 위치를 이동
- argv[1]에 이동할 path 정보가 담김
구현기능
-
cd
: 아무런 인자도 들어오지 않았다면 HOME 환경변수에 지정된 경로로 이동- HOME 환경변수가 지정되어 있지 않다면
bash: cd: HOME not set
을 표준에러에 출력 - HOME 환경변수에 지정된 경로가 올바르지 않다면
bash: cd: (PATH): No such file or directory
을 표준에러에 출력
- HOME 환경변수가 지정되어 있지 않다면
-
cd .
: 아무런 동작을 하지 않음 -
cd -
: OLDPWD 환경변수에 지정된 경로로 이동- OLDPWD 환경변수가 지정되어 있지 않다면
bash: cd: OLDPWD not set
을 표준에러에 출력 - HOME 환경변수에 지정된 경로가 올바르지 않다면
bash: cd: (PATH): No such file or directory
을 표준에러에 출력
- OLDPWD 환경변수가 지정되어 있지 않다면
-
cd ~
: HOME 환경변수에 지정된 경로로 이동-
HOME 환경변수가 지정되지 않았을 경우 passwd에서 홈디렉토리를 얻어옴
(bash 상에서는 되는데 minishell에서 될지는 확인해봐야함)
-
HOME 환경변수에 지정된 경로가 올바르지 않다면
bash: cd: (PATH): No such file or directory
을 표준에러에 출력
-
-
cd path
: path에 지정된 경로로 이동- path에 지정된 경로가 올바르지 않다면
bash: cd: (PATH): No such file or directory
을 표준에러에 출력
- path에 지정된 경로가 올바르지 않다면
- 디렉토리 이동 성공 시 PWD 환경변수를 새 디렉토리 이름으로 설정, OLDPWD 환경변수를 변경 전 디렉토리 이름으로 설정
- PWD는 이동에 성공한 경로
- OLDPWD는 이전 PWD의 값이 들어옴
- PWD, OLDPWD 모두 환경변수 등록이 되어있지 않다면 새로 생기지 않음
- 디렉토리가 아닌 파일을 인자로 줬을 때
bash: cd: (FILE): Not a directory
출력
반환값
- argv가 NULL이거나 argv[0]이 NULL인 경우 -1 반환
- 표준에러에 출력 시 -1 반환
- 이외의 경우 0 반환
구현해야할 기능
- 파이프 연결 시 이동하지 않고 출력만 함
- 리다이렉션 연결 시 출력한 뒤 이동
- CDPATH 기능 구현?
#include "builtin.h"
int ft_env(char **argv, t_envp *envp);
- 환경변수 테이블 출력
구현기능
-
env
: 아무런 인자가 들어오지 않을 경우 환경변수 테이블에 들어있는 값 출력- 출력 순서는 무시하기로..
- export 명령어와는 다르게 값이 NULL인 경우 출력하지 않음
-
env arg
: 인자가 들어온 경우env: (ARG): No such file or directory
출력, 127번 반환
#include "builtin.h"
t_error ft_export(char **argv, t_envp *envp);
- 환경변수 테이블에 항목 추가
구현기능
-
export key=value
: key=value형태로 추가됨 -
export “key”=”value”
: key=value형태로 추가됨 -
export “ “
:bash: export:
‘: not a valid identifier` 출력, 종료코드 1- key에 공백이 포함된 경우도 에러 출력
-
export
:declare -x key=”value”
형태로 정렬돼서 출력됨 -
export key
: value가 NULL인 형태로 테이블에 들어감, env에서는 출력되지 않지만 export로는 보임
#include "builtin.h"
t_error ft_unset(char **argv, t_envp *envp);
- 환경변수 테이블에서 항목 삭제
구현기능
-
unset key
: 해당 key를 가진 항목을 환경변수 테이블에서 삭제- 만약 해당 키가 없을 경우 명령을 그냥 무시함
-
unset keyA keyB
: 키가 여러개 들어왔을 경우 모든 키를 해제함
#include "builtin.h"
int ft_exit(char **argv);
구현기능
- 실행 시 무조건
exit\n
출력- 이 출력은 파이프로 전달되지 않음
- 인자를 지정해주지 않을 시 마지막으로 종료된 프로그램 상태 반환하며 종료
- 인자를 지정해줄 시 해당 인자의 상태코드로 종료
- 인자가 올바르지 않을 시
bash: exit: (INPUT): numeric argument required
출력 후 255번으로 종료 - 첫번째 인자가 올바르고, 인자가 0, 1개가 아닐 시
bash: exit: too many arguments
출력 후 종료 x
구현해야할 기능
- ctrl+D을 이용하여 종료 루틴을 밟아야지 않을까..?
-
ctrl+D를 호출하면 exit을 출력
(어디에다가 출력해야하는지는 모르겠음..)
-
저장된 종료 상태 코드를 반환
-
minishell 종료
-
- 마지막 프로그램의 종료 코드를 반환하는 기능
- 할당을 전부 해제하고 종료되도록 리턴값 변경
- 대화형일때만 exit을 출력하도록 변경
미구현 기능
- bash의 exit이 판단하는 numeric argument error의 기준은 long 자료형의 범위
- int자료형 범위로 제한함
bash 코드
int
exit_builtin (list)
WORD_LIST *list;
{
if (interactive)
{
fprintf (stderr, login_shell ? "logout\n" : "exit\n");
fflush (stderr);
}
return (exit_or_logout (list));
}
- 대화형 모드(사용자에게서 입력을 받는 중) 일 때 실행되면 표준에러에 exit 출력하고 종료
- 아닐 경우 출력하지 않고 종료
- built-in 함수 파이프 연결 추가
- 근데 자식 프로세스에서 함수 실행하게 하면 되지 않나?
- PATH 삭제 후 빌트인 실행해보기
wonyang & jeongmin의 미니쉘 뿌수기 !
- Summary: This project is about creating a simple shell. Yes, your own little bash. You will learn a lot about processes and file descriptors.
- 자세한 Subject 설명 : 📚 Subject
- 더 자세한 내용은 📄Wiki 를 확인해주세요!
프로젝트 기간: 2023.01.04 ~ 01.17
팀원 : wonyang, jeongmin
팀명 : 𝑰𝑺𝑭𝑱 특징
- 대체로 말을 잘 듣고 조용한 편이다.
- 성실하고 계획적이다.
- 타인에게 칭찬과 인정을 받는것에 상당히 민감하다.
- 재미없고 의미없는 일이라도 끝까지 한다.
- 성과를 공개적으로 발표하지 않고도 인정을 받는 것을 좋아한다.
- 자신의 의무를 다했다고 다른 사람들에게 인정받고 싶지만, 주목을 받고 싶지는 않다.
- 다른 사람 앞에서 발표하는 것을 두려워 한다.