Skip to content

Minishell Case

Misu Kim(Giromi) edited this page Sep 17, 2022 · 23 revisions

junoh님-case

hard case

bash-3.2$ echo "$USER na"me
minsuki2 name
bash-3.2$ echo "$$USER"
10884USER
bash-3.2$ echo hi"$USER"
himinsuki2
bash-3.2$ echo "$USER ?"
minsuki2 ?

execve case

a.out test/c.out 있을 때
a.out -> command not found
./a.out -> 정상 실행
b.out -> command not found
./b.out -> No such file or directory
test/c.out -> 정상 실행

디렉터리가 없을 때

bash-3.2$ /bin/df/ls
bash: /bin/df/ls: Not a directory

export case

bash-3.2$ export -=3df
bash: export: -=: invalid option
export: usage: export [-nf] [name[=value] ...] or export -

mypark님 케이스

echo a || (echo B && echo c | cat | cat -e) | cat && echo d
(cat < a && echo b ) > b
((echo B | echo F) && (echo G) > a) | echo I


## oflag case

### basic case
```bash
''
""
()
  • []

quote case

'ls
echo abc
'

: (쌍)따옴표는 개행을 포함해서 하나의 WORD로 처리

parentheses case

(ls
ls
ls
)

: 괄호는 개행을 ;로 대체해서 처리

bash: ((: ((((sleep 100)))): missing `)' (error token is "100))))")
bash-3.2$ ((((((sleep 100))))))

EOF

bash-3.2$ 'abc
> bash: unexpected EOF while looking for matching `''
bash: syntax error: unexpected end of file
bash-3.2$ echo $?
258
  • 1번 오류 -> ' 가 닫히지 않았는데 EOF가 와서 뜨는 오류
  • 2번 오류 -> 명령어에 EOF가 들어와서 뜨는 오류

Add_history

> ls
> ls
> ls
> '
bash:
ls
ls
ls
: command not found
bash-3.2$ '
ls
ls
ls
'

bash-3.2$ (
> ls
> ls
> ls
> )
Desktop		Documents	Downloads	Library		Movies		goinfre
Desktop		Documents	Downloads	Library		Movies		goinfre
Desktop		Documents	Downloads	Library		Movies		goinfre
bash-3.2$ ( ls; ls; ls; )
  • (쌍)따옴표는 히스토리에 개행 그대로 들어가는데
  • 괄호는
    1. 앞에 WORD가 있을 때 -> ;로 변환
    1. 앞에 WORD가 없을 때 -> 공백으로 변환(필수는 아닌 듯)

env($) 해석

bash-3.2$ export TEST="ho    -n     abc    |    ls"
bash-3.2$ echo $TEST
ho -n abc | ls
bash-3.2$ ec$TEST
abc | lsbash-3.2$
  • 환경변수($)해석은 모두 WORD 토큰으로 처리한다.(SPACE OR NEWLINE 기준)
TEST=t  e  s  t
USER=u  s  e  r

"ab$TEST"'ddd'$USER
--------------------
"ab$TEST" -> " interpreter -> ab$ -> "option $ interpreter
--------------------
ab|t  e  s  t -> token_str : abt  e  s  t
--------------------
'ddd' -> ' interpreter -> ddd -> token_str : abt  e  s  tddd
---------------------
$USER -> no option $ interpreter
---------------------
u | s | e | r -> abt  e  s  tdddu | s | e | r""

$USER'ddd'"ab$TEST"
----------------------
u | s | e | r -> ""u | s | e | rdddabt  e  s  t

"" -> $ 해석할 때 옵션 달아서 넘기기 -> 하나의 노드만 반환됨
'' -> 그냥 안에 내용 현재 노드에 붙이기
$ -> 옵션 X -> 공백문자 기준으로 노드를 만들어서 연결리스트 만들기
         옵션 O -> 전체 내용을 하나의 노드로 만들

         나와서 반환 받은 노드의 내용을 현재 노드 내용 뒤에 붙이고
         반환 받은 노드가 연결리스트 일 경우
                현재 노드의 next를 백업 해 두고 반환 받은 노드의 next로 대체
                next가 널일 때 까지 땡긴다음 백업해둔 주소를 next에 넣는다
        반환 받은 노드가 단일 노드일 경우
                별 다른 작업을 하지 않는다

*(wildcard) 해석

echo *
-> 해당 폴더 모든 파일 출력
echo *abc*
-> *abc* 텍스트 매칭되는 파일 출력
-> 매칭되는 파일 없을 때는 *abc* WORD 토큰으로 처리

echo ***
-> 매칭시에는 *로 처리

'/'의 경우 해당 토큰 str에 '*'이 있을 때만 압축해서 매칭 시도

~(tilde) 해석

bash-3.2$ echo ~
/Users/jaesjeon
bash-3.2$ echo ~/
/Users/jaesjeon/
bash-3.2$ echo ~////
/Users/jaesjeon////
bash-3.2$ echo ~////$USER
/Users/jaesjeon////jaesjeon
bash-3.2$ echo ~abc
~abc
bash-3.2$ echo abc~
abc~
bash-3.2$ echo $~
$~
bash-3.2$ echo ABC$~ABC
ABC$~ABC
  • ~의 해석은 무조건 첫 글자로 와야하고, 뒤에 '\0' 문자나 '/' 문자의 경우에만 해석됨
  • $뒤에 ~가 오는 경우 환경변수로 해석되지 않고 그대로 문자로 처리됨

Parcing

bash-3.2$ export A=0
bash-3.2$ export A=123 | export A=345 && echo $A && echo $A
0
0
bash-3.2$ export A=123 | (export A=345 && echo $A && echo $A)
345
345
bash-3.2$ (export A=123 | export A=345) && echo $A && echo $A
0
0

&& CMD

bash-3.2$ < a && cat -e
abc
abc$
bash-3.2$ < a cat -e
aaaa$

&&와 ||는 따로 fork를 하지 않고 현재 쉘에서 명령어를 순서, 조건에 맞게 실행 위에서 && 이어줬음에도 cat이

junoh님 case

echo $?
echo $?
echo ??
echo ?
echo $??
echo $USERname
echo $USER name
echo "$USER na"me
echo '$USER na'me
echo "$$USER"
echo hi$USER
echo hi"$USER"
echo $USEEER
echo ?$USER
echo hell"o"" "from " 42"
echo "$USER ?"

// ls 테스트
ls
ls -l
ls -al

// quit, 반환값 테스트
./minishell
quit 113
echo $?
wrongcmd
echo $?
ls
echo $?

// 잡다하게 섞은거
< infile cat
< infile cat | grep a
< infile cat | grep a | wc
< infile cat | grep a | wc -l
cat < infile

// SHLVL 환경변수
env
env | grep SHLVL
./minishell
env | grep SHLVL -> SHLVL 값 확인
//export, unset
export a=b b=c c=d
export a=aa b=cc
export A=B B=C
unset a
unset b c A B
*exportO=o
*exportO+=o

// cd
cd ~
cd
cd -
echo $OLDPWD

// ctrl + [d, c, \] 테스트

// pwd 테스트
pwd

// heredoc + append
<< eof cat >> infile -> infile 뒤에 추가됨
by donpark, joonpark :)

bash
<< HERE_DOC > a.txt | cat a.txt | wc -l
<< HERE_DOC > a.txt | cat a.txt
ls -al | > a.txt
ls -al | cat

bash
"echo" "-n" "hello"
"echo" "-n hello"
"echo -n" "hello"
"echo" "-n-n-n-n-n-n-n-n" "hello"

a=ho -n
ec$a -n hello
bash
cat | cat | ls

시작하자마자 unset OLDPWD

Pwd 인자

env | grep SHLVL -> 시작하자마자 ++

bash
echo ' " $HOME " '

//사라진 경로 테스트
mkdir test
cd test
rm -rf ../test
pwd
Cd .
Env | grep PWD

https://42born2code.slack.com/archives/CNA2Z8RBP/p1642091711022100

echo $P$P$P$PWD

<< eof | cat

echo -nnnnnnnnn -n -nnnnnm

|

ls | | wc

echo "''$PWD'''qwere"qwqwer$P$P$PWD"'$PWD'"

ls |;

ls |&

$_ : env | grep SHLVL

echo $TEST > $TEST

unset PWD

cd ... x 8

- [ ] ls /*/

export a="ls -la"

$a

l's'

- [ ] export a =asd //갱신x
  - [ ] a가 존재할 때 a=로 갱신 O
  - [ ] a=가 존재할 때 a로 갱신 X
  - [ ] a와 a=가 동시에 존재할 수 없음

export a="algo=k"

unset HOME && cd ~

export a='algo"algo'

echo "$a"

avoid awk

export a=">>"

ls $a algo

exit 4 y fuera de las shell echo $?

exit a1

exit 1a

<< ola | grep 42 | cat

export a="ls -la"

"$a"

ls | exit | wc

cd .. | rm -rf minishell

https://github.com/solaldunckel/minishell-tester/blob/master/test.sh

ECHO TESTS
 echo test tout
 echo test tout
 echo -n test tout
 echo -n -n -n test tout

CD TESTS
 cd .. ; pwd
 cd /Users ; pwd
 cd ; pwd
 mkdir test_dir ; cd test_dir ; rm -rf ../test_dir ; cd . ; pwd ; cd . ; pwd ; cd .. ; pwd

PIPE TESTS
 cat tests/lorem.txt | grep arcu | cat -e
 echo test | cat -e | cat -e | cat -e | cat -e | cat -e | cat -e | cat -e | cat -e | cat -e | cat -e| cat -e| cat -e| cat -e| cat -e| cat -e| cat -e| cat -e| cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e|cat -e -> fd가 255를 넘어 오류처리 하기로

 ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls|ls -> fd가 255를 넘어 오류처리 하기로

 cat /dev/random | head -c 100 | wc -c

ENV EXPANSIONS + ESCAPE
 export TEST=abc
 echo test \ test
 echo "test
 echo $TEST
 echo "$TEST"
 echo '$TEST'"
 echo "$TEST$TEST$TEST"
 echo "$TEST$TEST=lol$TEST"
 echo " $TEST lol $TEST"
 echo $TEST$TEST$TEST
 echo $TEST$TEST=lol$TEST""lol
 echo $TEST lol $TEST
 echo test "" test "" test

image
 echo "$=TEST"
 echo "$"
 echo "$?TEST"
 echo $TEST $TEST
 echo "$1TEST"

image
 echo "$T1TEST"

ENV EXPANSIONS
 export =
 export 1TEST=
 export TEST
 export ""=""
 export TES=T=""
 export TE+S=T=""
 export TEST=LOL ; echo $TEST
 export TEST=LOL ; echo $TEST$TEST$TEST=lol$TEST
 export TEST=LOL; export TEST+=LOL ; echo $TEST -> +=연산자까지 구현 범위일지 고민
 ENV_SHOW="env | grep SHLVL"
 EXPORT_SHOW="export | grep SHLVL"
 $ENV_SHOW ->env에 인자가 들어오면 오류메세지를 띄워주자 -> subject분야가아니라 안함
 $EXPORT_SHOW
 export TEST="ls -l - a"
 echo $TEST

REDIRECTIONS
 echo test > ls ; cat ls
 echo test > ls >> ls >> ls ; echo test >> ls; cat ls
 > lol echo test lol; cat lol
 >lol echo > test>lol>test>>lol>test mdr >lol test >test; cat test
 cat < ls
 cat < ls > ls

MULTI TESTS
 echo testing multi ; echo "test 1 ; | and 2" ; cat tests/lorem.txt | grep Lorem

SYNTAX ERROR
 ;; test
 | test
 echo > <
 echo | |
 <

EXIT
 exit 42
 exit 42 53 68
 exit 259
 exit 9223372036854775807
 exit -9223372036854775808
 exit 9223372036854775808
 exit -9223372036854775810
 exit -4
 exit wrong_command
 gdagadgag
 ls -Z
 cd gdhahahad
 ls -la | wtf

1. Simple Command
/bin/ls
/bin/echo
/bin/cat
/adsasdasd/sadasd/ls

2. Arguments
/bin/ls -l .
/bin/echo Hello
/bin/cat srcs/main.c

3. echo
echo
echo Hello
echo -n Hello
echo -nnnn Hello
echo -n -n -n Hello
echo Hel     lo

4. exit
exit
exit 3
exit 123
exit a

5. Return value of a process
0 : success (/bin/ls -l . -> echo $?)
1 : file not found (/bin/ls -l invalid -> echo $?)
127 : cmd not found (asdf)
- [ ] 126 : is dir (/bin)
- [ ] 258 : syntax error (>>>>>)
- [ ] 130 : child int (cat -> Ctrl-C)
- [ ] 131 : child quit (cat -> Ctrl-\\)

7. Signal
Ctrl-C
Ctrl-D
Ctrl+\\

8. Double Quotes
echo "Hello" | cat -e
echo "Hello
- [ ] echo " Hello ; echo 123    " | cat -e
- [ ] echo " \\\\\\" \\$HOME $HOME "
- [ ] echo "'$HOME'"

9 ~ 11. env + export + unset
env
export TEST1=1 -> env, export 확인
export TEST2 -> env, export 확인
export TEST3= -> env, export 확인
unset TEST1 -> env, export 확인
unset TEST2 -> env, export 확인
unset TEST3 -> env, export 확인

12. Environment Variables
echo $HOME
echo $PATH
echo "$HOME"
echo "$PATH"
echo '$HOME'
echo '$PATH'

13 ~ 14. cd + pwd
pwd ls
cd srcs -> pwd ls
cd . -> pwd ls
cd .. -> pwd ls
cd ../../../../../../../../../
cd ././././././././
cd ../../././../.././././../
cd invalid -> echo $?

15. Relative Path
ls -l
cat srcs/main.c
ls -l ../../.././././../

16. Environment Path
ls -> unset PATH -> ls
(bash: ls: No such file or directory)
- [ ] PATH에 가장 왼쪽에 있는 디렉터리 (path1 & path2)

17. Simple Quotes
echo 'Hello'
echo 'Hello
echo ''
echo '$HOME'
echo ' $HOME  ; ; ; echo $PATH $ '
- [ ] echo '\\\\\\\\""""'
- [ ] echo '"$HOME"'

18. Redirection
echo Hello > tmp (새로 만들어)
echo World >> tmp (추가모드)
cat < tmp
grep int < srcs/main.c
echo Hello > tmp1 > tmp2 > tmp3
> tmp4 echo ABC
ls -l > tmp6 | grep d

19. Pipe (개행까지 복사하면 제대로 동작 X)
cat /etc/passwd | grep ':' | more
ls -l | grep d
ls invalid | grep d | more
ls -l | grep d > tmp5
Cat | cat | ls

20. Go Crazy
askdfjasdkhakdjfhadfhadjkadhfjkahdfjksdfuiyweuifhweuifhwuihfiwudhfiuwhdfuiwd
echo a s k d f j a s d k h a k d j f h a d f h a d j k a d h f j k a h d f j k s d f u i y

echo ' " $HOME " '
mkdir test
cd test
rm -rf ../test
pwd

Clone this wiki locally