|
|
|
|
⭐️ From S0YKIM
C project to mimic bash shell. This program interprets and executes commands just like bash shell. Built-in functions such as echo, cd, exit, etc. available.
|
|
|
|
⭐️ From S0YKIM
끝나지 않는 파싱 지옥
int ft_launch_minishell(t_data *data, char *line)
{
int result;
if (!line)
{
printf("exit\n");
return (SUCCESS);
}
else if (!*line)
return (SUCCESS);
add_history(line);
result = parse_and_execute(data, line);
if (result == ERROR)
return (SUCCESS);
else if (!result)
return (FAILURE);
return (SUCCESS);
}
int main(int argc, char **argv, char **envp)
{
t_data data;
if (argc >= 3 && !ft_strcmp(argv[1], "-c"))
{
if (!init(&data, envp))
exit(EXIT_FAILURE);
int exit_status = ft_launch_minishell(&data, argv[2]);
exit(exit_status);
}
return (SUCCESS);
}
cat | ls
같은 명령어를 입력하여 자식 프로세스에서 입력 대기를 하는 경우
^C를 입력하면 부모 쉘이 종료되는 문제 발생
README.md 문서를 업데이트할 때 언급해주세요
export b$
export b-8
Originally posted by @hhkim0729 in #172 (comment)
export a=" a b "
echo $a 👉 `a b`
echo "$a" 👉 ` a b `
bash-3.2$ cat $a
cat: a: No such file or directory
cat: b: No such file or directory
bash-3.2$ cat "$a"
cat: a b : No such file or directory
/
가 포함되어 절대 또는 상대 경로가 주어진 경우 No such file or directory./ls
는 어떻게 실행되고 있는 걸까요..? 신기Originally posted by @hhkim0729 in #172 (comment)
ft_unset() 함수 구현 중 해당 노드를 삭제하는데 직전 노드와 다음 노드를 연결해주는 과정에서 prev 포인터가 없어서 어려움을 겪고 있습니다. 환경 변수 리스트를 이중 연결 리스트로 변경해주시면 감사하곘습니다!
메인 함수 작성
export abc=123 과 같이 '=' 가 들어가면 아무런 문제가 없지만, export abc 처럼 값을 주지 않고 키만 넘겨주는 경우 문제가 생깁니다.
add_new_node() 는 애초에 초기 환경변수 리스트를 불러오는 것을 전제로 만들어진 함수였기 때문에 무조건 '=' 가 들어가 있는데, export 명령어에서 사용하기에는 문제가 있어 리팩토링 하도록 하겠습니다!
몇몇 함수들을 사용할 때, 해당 함수에서 오류를 반환하지만 사용하는 함수에서 예외처리를 하지 않는 경우가 보입니다.
전체적으로 리팩토링을 한번 해야 할 것 같습니다.
cat | cat
ls | cat
cat | ls
등의 명령어를 실행하면 입력을 대기하여 배쉬와 다르게 동작하는 문제
그때 안 하기로 했었던 거 같지만 다들 하더라고요...
배쉬와 같이 동작해야 한다고 하면 하는 게 맞을 것 같아서 올려봅니다~~
readline
으로 받은 명령어 파싱
echo hello > a
export >> b
와 같이 명령어가 하나이고 빌트인인 경우 자식 프로세스를 포크하지 않아서 리다이렉션 세팅 과정을 거치지 않는 문제가 발생합니다.
Originally posted by @hhkim0729 in #172 (comment)
minishell.h
밸류가 존재하지 않는 환경변수는 존재하지 않는 취급을 해야 함 => 파싱할 때 아예 삭제를 해야 할 듯..?
$a
가 존재하지 않을 때
export $a
는 export
와 동일하게 동작export "$a"
는 빈 문자열이 들어온 것으로 인식하여 오류 발생일단 복구해서 hhtmp 원격 브랜치에 올려두었습니다..
예를 들어 export ABC=$? 를 입력하면 환경변수 $? 의 값을 불러와서 실제로는 ABC=1 의 형태로 치환되어 환경변수가 저장됩니다.
하지만 지금 구현한 ft_export()에서 환경변수를 저장할 때에 쓰는 add_env_node() 함수는 '=' 를 기준으로 뒤에 나오는 문자열을 그대로 값에 넣어주게 됩니다.
아예 명령어 파싱하는 부분에서
main 함수의 세 번째 인자로 받는 char **envp 를 key-value 형태로 파싱
export 123 | echo 123
같은 명령어를 실행하면 export
의 아웃풋이 파이프로 연결됩니다.
이로 인해 오류 메시지를 printf
를 이용해서 STDOUT
으로 출력하면 콘솔에 출력이 되지 않습니다.
오류 메시지들은 ft_putstr_fd
나 ft_putendl_fd
등 libft 함수를 사용해서 STDERR
에 출력해주세요.
Originally posted by @hhkim0729 in #172 (comment)
bash에서는 heredoc 도중에 ctrl + c를 입력하면 더이상 입력을 받지 않고 종료합니다.
현재 미니쉘에서는 다음줄로 넘어가서 입력을 대기합니다.
현재 main 문의 가장 끝에 system("leaks minishell"); 을 추가하여 실행하면 70개의 메모리 누수가 뜨네요! 빌트인 함수나 다른 함수를 추가하지 않고도 메모리 누수가 나는 것으로 보아 create_astree() 에서 발생한게 아닐지 추측하고 있어요 한 번 확인 부탁드립니다~
명령어를 실행하기 전에 syntax error 검사
|
||
cat |
등)<
cat <
cat < | ls
등)에러 메시지의 규칙을 정확히 모르겠어서 모두 syntax error로 출력하도록 하였습니다.
(서브젝트 요구사항에 에러 메시지를 똑같이 출력하라는 부분이 없기 때문에 이렇게 해도 무방할 것 같아요~!)
여유있으면 해봅시다요
환경변수 리스트 저장하실 때에 마지막에
Originally posted by @S0YKIM in https://github.com/S0YKIM/42-MINISHELL/issues/5#issuecomment-1094195646
빌트인 함수나 쉘 명령어 등을 실행시켜주는 함수 구현
minishell > (space)
세그 폴트 발생
Originally posted by @hhkim0729 in #172 (comment)
생각해보니까 execve를 쓸 수 있는 이유가 환경변수 전달을 할 수 있어서였던 거 같아요.
execve 함수 마지막 인자로 환경변수를 보낼 수 있는데, 거기다 NULL을 보내고 있어서 환경변수를 못 받았던 거 아닌가 싶습니다.
문제는 가공되지 않은 envp 값을 넘겨주려면 이걸 어디에 담아서 들고다니거나 해야 할 거 같은 느낌..?
env_list에서 key의 길이만큼만 비교해서 일치하는 경우 해당 밸류를 가져오는데, 앞의 문자열이 겹치는 경우 가장 앞에 있는 밸류를 그냥 가져와버립니다.
if (!ft_strncmp(curr->key, key, ft_strlen(key)))
return (ft_strdup(curr->value));
예: $TERM
키가 존재하지 않지만 $TERM_PROGRAM
의 밸류를 가져옴
curr->key의 길이와 key의 길이가 같은지도 비교를 해주셔야 할 것 같습니다.
>a
와 같이 리다이렉션 단독으로 입력되었을 때 세그폴트 발생
Originally posted by @hhkim0729 in #172 (comment)
예를 들어 unset OLDPWD 를 입력하고 env 를 해보면 OLDPWD 가 삭제되지 않고 그대로 남아있습니다. 환경변수 리스트 g_env_list 가 자식 프로세스에서만 변경되고 exit 되어, 부모 프로세스에서는 여전히 변경 전의 모습으로 남아있는 것으로 추정됩니다. 이뿐만 아니라 cd [이동할 디렉토리] 명령어 역시 같은 원리로 작동하지 않습니다 아마 자식프로세스에서만 경로를 이동하고 부모에서는 여전히 그대로 남아있는 것 같네요...
ls | cat 처럼 이전 파이프라인의 output 이 다음 파이프라인의 input 으로 직접 넘어가는 경우 뿐만 아니라, 이런 상태변화도 고려를 해주어야겠어요!
존재하지 않는 환경변수를 입력하면 종료되는 문제
(이 외에도 존재하지 않는 환경변수 테스트케이스들이 통과가 안 됩니다요)
어제 제가 환경변수 수정하고 평가했을 때 잘 됐었는데 소연님 코드에서 뭔가 수정된 거 같아요!
Originally posted by @hhkim0729 in #210 (comment)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.