Skip to content

built in 함수 구현

jeongmin edited this page Jan 9, 2023 · 1 revision

built-in 함수 구현

echo

#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 반환

pwd

#include "builtin.h"

int	ft_pwd(char **argv);
  • 현재 프로그램의 위치를 표준출력에 출력
  • argv는 무시됨

반환값

  • getcwd 함수 호출 실패 시 -1 반환
  • 이외의 경우 0 반환

cd

#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 을 표준에러에 출력
  • cd . : 아무런 동작을 하지 않음
  • cd - : OLDPWD 환경변수에 지정된 경로로 이동
    • OLDPWD 환경변수가 지정되어 있지 않다면 bash: cd: OLDPWD not set 을 표준에러에 출력
    • HOME 환경변수에 지정된 경로가 올바르지 않다면 bash: cd: (PATH): No such file or directory 을 표준에러에 출력
  • 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 을 표준에러에 출력
  • 디렉토리 이동 성공 시 PWD 환경변수를 새 디렉토리 이름으로 설정, OLDPWD 환경변수를 변경 전 디렉토리 이름으로 설정
    • PWD는 이동에 성공한 경로
    • OLDPWD는 이전 PWD의 값이 들어옴
    • PWD, OLDPWD 모두 환경변수 등록이 되어있지 않다면 새로 생기지 않음
  • 디렉토리가 아닌 파일을 인자로 줬을 때 bash: cd: (FILE): Not a directory 출력

반환값

  • argv가 NULL이거나 argv[0]이 NULL인 경우 -1 반환
  • 표준에러에 출력 시 -1 반환
  • 이외의 경우 0 반환

구현해야할 기능

  • 파이프 연결 시 이동하지 않고 출력만 함
  • 리다이렉션 연결 시 출력한 뒤 이동
  • CDPATH 기능 구현?

env

#include "builtin.h"

int		ft_env(char **argv, t_envp *envp);
  • 환경변수 테이블 출력

구현기능

  • env : 아무런 인자가 들어오지 않을 경우 환경변수 테이블에 들어있는 값 출력
    • 출력 순서는 무시하기로..
    • export 명령어와는 다르게 값이 NULL인 경우 출력하지 않음
  • env arg : 인자가 들어온 경우 env: (ARG): No such file or directory 출력, 127번 반환

export

#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로는 보임

unset

#include "builtin.h"

t_error	ft_unset(char **argv, t_envp *envp);
  • 환경변수 테이블에서 항목 삭제

구현기능

  • unset key : 해당 key를 가진 항목을 환경변수 테이블에서 삭제
    • 만약 해당 키가 없을 경우 명령을 그냥 무시함
  • unset keyA keyB : 키가 여러개 들어왔을 경우 모든 키를 해제함

exit

#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 출력하고 종료
  • 아닐 경우 출력하지 않고 종료

todo

  • built-in 함수 파이프 연결 추가
    • 근데 자식 프로세스에서 함수 실행하게 하면 되지 않나?
  • PATH 삭제 후 빌트인 실행해보기

📄 Docs

🔖 Parsing

  1. preprocessing
    1️⃣ tokenization
    2️⃣ check syntax error

🏛 ADT

⚙️ function

Clone this wiki locally