Closed ak0327 closed 1 year ago
*~cat | cat | ls
ができなくなっている~
cat | ls
-> EOFでsegv~cat | echo << end
で cat: stdin: Input/output error Segmentation fault: 11
~
修正完了
()
はNG, (())
はOKらしい なにこれ
~ minishell $> <<
~
~ minishell: syntax error near unexpected token <<'~ ~* bash: syntax error near unexpected token
newline'~
space
x2以上の入力でleak~ inputのcontinueの際にclear inputを通すように変更*
export c=$PATH
-> minishell: export: `Support/(略) ': not a valid identifier* PATHに
以下にて解決space
があると分解されて渡されているみたい?問題ないか見直す
*
export a="hello world"; export b=$a
の際、$a="hello", "world"で渡されるためb=hello, worldはerrorとなる。bashは$b="hello world"として登録*
echo $a
は{"echo" "hello", "world"}
として振る舞っているのに...?assignmentで挙動が変わるのか?それはめんどい。保留* ワイルドカードと同じように、exportの時にre tokenizeしないようにできそう
bash3.2_2[0] $ export a="hello world"
bash3.2_2[0] $ export b=$a
bash3.2_2[0] $ export c="export d=$a"
bash3.2_2[0] $ echo $a //hello world
bash3.2_2[0] $ echo $b //hello world
bash3.2_2[0] $ echo $c //export d=hello world
bash3.2_2[0] $ echo $d //
bash3.2_2[0] $ $c
bash3.2_2[0] $ echo $c //export d=hello world
bash3.2_2[0] $ echo $d //hello <- "hello"までしか登録されていない
* re tokenizeするときに先頭が
export
であればre tokenizeしなければよさそう* これで $dの挙動も再現できる
* "export d=hello world"のような塊で来た時には分割できる
対応完了! heredocでも同様の展開になっていて。対応しておいてよかった。
使用可能関数:問題なし(memcpyが呼ばれているが探せない。コンパイラの仕業?)
ここまでの変更分をmianへmerge
bash-3.2-2 255 $ exit 1 | exit 2 | exit 3
bash-3.2-2 3 $
複数のケースで終了しない exit出力しない
bash-3.2-2 0 $ "$c"
bash: "echo hello world": command not found
bash-3.2-2 127 $
bash-3.2-2 127 $
bash-3.2-2 127 $ $c
bash: "echo: command not found
export +=test
でエラーが出ない
bash-3.2-2 0 $ export abc +=test
bash: export: `+=test': not a valid identifier
cd PATH
遷移後のcd -
でOLDPWD=NULL
になるquote expasion, heredoc, exitは #28 で修正する -> 完了
unset PATH
でのコマンド実行bash3.2_3[0] $ unset PATH
bash3.2_3[0] $ ls in1
in1dayo
bash3.2_3[0] $ ./ls in1
in1dayo
bash3.2_3[0] $ /bin/ls
dir dir2 in1 in3 ls ou2 out2
minishell 0 $> unset PATH
minishell 0 $> ls in1
minishell: ls: command not found
minishell 127 $> ./ls in1
in1dayo
minishell 0 $> /bin/ls
dir dir2 in1 in3 ls ou2 out2
exit
引数なしはstatusを保持したままexitが正しい挙動
exit
でstatusは2^C
1 -> exit
でstatusは1cd nothing
はstatusを1に変更するFeb/7th test
command execution
unset PATH
でのコマンド実行- minishellはcommand not found, bashはcurrentを実行
- current dirのlsはcatをcopyしてrenameした
bash3.2_3[0] $ unset PATH bash3.2_3[0] $ ls in1 in1dayo bash3.2_3[0] $ ./ls in1 in1dayo bash3.2_3[0] $ /bin/ls dir dir2 in1 in3 ls ou2 out2 minishell 0 $> unset PATH minishell 0 $> ls in1 minishell: ls: command not found minishell 127 $> ./ls in1 in1dayo minishell 0 $> /bin/ls dir dir2 in1 in3 ls ou2 out2
exit
exit
引数なしはstatusを保持したままexitが正しい挙動
- ex) syntaxerror 258 ->
exit
でstatusは2- ex)
^C
1 ->exit
でstatusは1
→修正修正済み
cd
cd nothing
はstatusを1に変更する
→修正修正済み
Feb/6th test
exit
bash-3.2-2 255 $ exit 1 | exit 2 | exit 3 bash-3.2-2 3 $
複数のケースで終了しない exit出力しない
heredoc
- eof後に改行し出力される
quote expansion
- quote expansionの挙動が異なる
bash-3.2-2 0 $ "$c" bash: "echo hello world": command not found bash-3.2-2 127 $ bash-3.2-2 127 $ bash-3.2-2 127 $ $c bash: "echo: command not found
export
export +=test
でエラーが出ない
→修正済み
bash-3.2-2 0 $ export abc +=test bash: export: `+=test': not a valid identifier
→修正済み
cd
- leaks
cd PATH
遷移後のcd -
でOLDPWD=NULL
になる
→修正済み
> out
ができなくなっている .........................................(1)~>> out
これも同様~
// NG
minishell 1 $> >out
Interrupt by signal : 11
// これはOK minishell 0 $> echo hello > out
// NG minishell 0 $> <<end
hoge end Interrupt by signal : 11
// これはOK minishell 0 $> cat <<end
hoge end hoge minishell 0 $>
bash3.2_2[0] $ echo 1 && echo 2 || echo 3 || echo 4 && echo 5
1
2
5
minishell 0 $> echo 1 && echo 2 || echo 3 || echo 4 && echo 5
1
2
以降、テストケース参考元 https://github.com/nafuka11/42_minishell_tester
echo $PWD, mkdir dir; ln -s dir symdir; cd symdir
minishell 0 $> exit -- 42
exit
minishell: exit: --: numeric argument required
minishell 255 $>
bash3.2_4[0] $ exit -- 42 exit bash3.2_3[42] $
* ~符号のみ ...............................................................................**(5)**~ -> 完了
* ~これはstrtolの修正~
```shell
minishell 0 $> exit +
exit
bash3.2_2[0] $
bash3.2_3[0] $ exit +
exit
bash: exit: +: numeric argument required
bash3.2_2[255] $
;
の入るケース~ -> 完了
minishell 0 $> exit 0 0; exit
exit
minishell: exit: too many arguments
exit
bash3.2_2[1] $
// exitしないらしい(shlvl=5のまま) bash3.2_5[0] $ exit 0 0; exit exit bash: exit: too many arguments bash3.2_5[1] $
<br>
## expand
* OK
<br>
## export
* OK
<br>
## path
* OK
<br>
## pwd
* shell立ち上げてすぐの`$OLDPDW=NULL`
* テスト全てやっていないので他にもあるかも
```shell
takira % ./minishell
minishell 0 $> echo $OLDPWD
/Users/akira/Documents/Programming/CLionProjects/42/42cursus/03_minishell_rev1
minishell 0 $>
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
bash3.2_6[0] $ echo $OLDPWD
bash3.2_6[0] $
command not found
, .
始まりの場合にはno such file or directory
, /
始まりの場合にはnot a directory
になる~
minishell 0 $> no_such_file
minishell: no_such_file: command not found
minishell 127 $> ./no_such_file
minishell: ./no_such_file: command not found
minishell 127 $> /bin/ls/no_such_file
minishell: /bin/ls/no_such_file: command not found
bash3.2_6[0] $ no_such_file bash: no_such_file: command not found bash3.2_6[127] $ ./no_such_file bash: ./no_such_file: No such file or directory bash3.2_6[127] $ /bin/ls/no_such_file bash: /bin/ls/no_such_file: Not a directory
<br>
* ~`$nothing`単独の場合はcommand not foundにしない ..................................**(6)**~ ->完了
```shell
minishell 127 $> echo a | $NO_ENV
minishell: : command not found
minishell 127 $>
bash3.2_6[1] $ echo a | $NO_ENV
bash3.2_6[0] $
~* エラー文が異なる~
// semicolon
minishell 258 $> ;;
minishell: syntax error near unexpected token `;;'
minishell 258 $> ;;;
minishell: syntax error near unexpected token `;;;'
minishell 258 $> ;;;;
minishell: syntax error near unexpected token `;;;;'
bash: syntax error near unexpected token `;;'
bash3.2_6[258] $ ;;;
bash: syntax error near unexpected token `;;'
bash3.2_6[258] $ ;;;;
bash: syntax error near unexpected token `;;'
// redirection >
minishell 258 $> >>>
minishell: syntax error near unexpected token `>>>'
minishell 258 $> >>>>
minishell: syntax error near unexpected token `>>>>'
bash3.2_6[258] $ >>>
bash: syntax error near unexpected token `>'
bash3.2_6[258] $ >>>>
bash: syntax error near unexpected token `>>'
// redirection < >
minishell 258 $> < >
minishell: syntax error near unexpected token `newline'
bash3.2_6[258] $ < >
bash: syntax error near unexpected token `>'
// redirection command < >
minishell 258 $> cat < >
minishell: syntax error near unexpected token `newline'
bash3.2_6[258] $ cat < >
bash: syntax error near unexpected token `>'
bash3.2_6[258] $
(())
はsubshellではなく算術演算の展開らしい
対応する必要なさそう
(())
はsyntax errorに戻す
env --
export --
./
付与しなくなっている?leaks rm -rf dir -> cd ..
bash3.2_5[0] $ ./ls
bash: ./ls: Permission denied
bash3.2_5[126] $
<in1 cat | >out1 <<a
int set_tc_attr_in_execute(void)
のperror("open")が出力されていた
minishell 0 $> echo 1 | echo 2 && echo 3 | (echo 4 | echo 5 && echo 6) && echo 7; echo 8
2
open: Bad address
5
6
7
8
<br>
* ~interrupt by signal~ -> とりあえず対応完了 分岐は維持したままerror msgのprintを削除した
``` shell
minishell 0 $> echo 0 && (echo 1 | echo 2 && echo 3) | echo 4 | echo 5
0
5
Interrupt by signal : 13
chmod -r ngdir; cd ngdir
int check_dir_exist(char *tdir, char *cmd, int print_flag)
のEACCESS 13っぽいerrno=EACCESS
の時にaccess(tdir, X_OK) == 0
ならばEXIT_SUCCESS
の分岐を追加して解決~ mkdir dir; cd dir; chmod -x dir; cd ..
でもstatusが13になる(bashは0)
chmod 000 ngdir; chmod +r ngdir; cd ngdir
minishell 0 $> cd ngdir
minishell 0 $>
minishell 0 $> pwd
/Users/akira/Documents/Programming/CLionProjects/42/42cursus/03_minishell_rev1/testdir
bash3.2_4[0] $ cd ngdir/
bash: cd: ngdir/: Permission denied
bash3.2_4[1] $
mkdir dir; cd dir; rm -rf dir; cd ..
cd: error retrieving current directory: getcwd: cannot access parent directories: directories: No such file or directory
minishell 0 $> ls
dir__ dir__x dir_r_ dir_rx
minishell 0 $> cd dir_r_
minishell 0 $> pwd
/Users/akira/Documents/Programming/CLionProjects/42/42cursus/03_minishell_rev1/dir
minishell 0 $>
bash3.2_2[0] $ cd dir_r_
bash: cd: dir_r_: Permission denied
bash3.2_2[1] $