-
Notifications
You must be signed in to change notification settings - Fork 1
Minishell Case
Misu Kim(Giromi) edited this page Sep 17, 2022
·
23 revisions
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 ?
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 directorybash-3.2$ export -=3df
bash: export: -=: invalid option
export: usage: export [-nf] [name[=value] ...] or export -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
''
""
()
- []
'ls
echo abc
': (쌍)따옴표는 개행을 포함해서 하나의 WORD로 처리
(ls
ls
ls
)
: 괄호는 개행을 ;로 대체해서 처리
bash: ((: ((((sleep 100)))): missing `)' (error token is "100))))")
bash-3.2$ ((((((sleep 100))))))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가 들어와서 뜨는 오류
> 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; )
- (쌍)따옴표는 히스토리에 개행 그대로 들어가는데
- 괄호는
-
- 앞에 WORD가 있을 때 -> ;로 변환
-
- 앞에 WORD가 없을 때 -> 공백으로 변환(필수는 아닌 듯)
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에 넣는다
반환 받은 노드가 단일 노드일 경우
별 다른 작업을 하지 않는다
echo *
-> 해당 폴더 모든 파일 출력
echo *abc*
-> *abc* 텍스트 매칭되는 파일 출력
-> 매칭되는 파일 없을 때는 *abc* WORD 토큰으로 처리
echo ***
-> 매칭시에는 *로 처리
'/'의 경우 해당 토큰 str에 '*'이 있을 때만 압축해서 매칭 시도
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' 문자나 '/' 문자의 경우에만 해석됨
- $뒤에 ~가 오는 경우 환경변수로 해석되지 않고 그대로 문자로 처리됨
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
bash-3.2$ < a && cat -e
abc
abc$
bash-3.2$ < a cat -e
aaaa$
&&와 ||는 따로 fork를 하지 않고 현재 쉘에서 명령어를 순서, 조건에 맞게 실행 위에서 && 이어줬음에도 cat이
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