tkomatsu/minishell

Error handling

Closed this issue · 5 comments

bash との挙動差異。
リストアップ。

  • No.1 ▼スペース区切りの環境変数展開時の引数の渡され方が異なる
bash-3.2$ export hello="aa bb cc dd"
bash-3.2$ touch $hello ←4つの文字列が個別に引数で渡される
bash-3.2$ ls
aa
bb
cc
dd
bash-3.2$ touch "$hello" ←1つの引数で渡される
bash-3.2$ ls
aa bb cc dd

bash-3.2$ export
declare -x a="a       b            c"
bash-3.2$ echo $a ←3つの文字が個別に引数で渡される
a b c
bash-3.2$ echo "$a" ←1つの引数で渡される
a       b            c
  • No.2 ▼子プロセスのexitはメッセージ出さない
bash-3.2$ exit | exit | exit | exit
bash-3.2$
  • No3. ▼bashだとクォート閉じずにCtrl-Dの終了ステータスが258になる
bash-3.2$ echo "safasf
>
> bash: unexpected EOF while looking for matching `"'
bash: syntax error: unexpected end of file
bash-3.2$ echo $?
258
  • No.4 ▼command not foundのとき一律0になってしまっている(bashだと127)
bash-3.2$ sadfa
bash: sadfa: command not found
bash-3.2$ echo $?
127
  • No.5 ▼ambiguos redirect (今回は対応しない)
bash-3.2$ export hello="aa bb cc dd"
bash-3.2$ > $hello
bash: $hello: ambiguous redirect
bash-3.2$ > $hello\\"dsfsafdsa"sfdsafdafaf"dsafasfa"
bash: $hello\\"dsfsafdsa"sfdsafdafaf"dsafasfa": ambiguous redirect
  • No.6 ▼bashだと下記ケースでドルマークが消える
bash-3.2$ echo $"sdfadfs"
sdfadfs
  • No.7 ▼exportの変数一覧のソート順がASCII順

  • No.8 ▼リダイレクトエラー時の終了ステータスが0になってしまう(bashだと1)

minishell$ < aaa
minish: aaa: No such file or directory
minishell$ echo $?
0 ← 1 であるべき
  • No.9 ▼ドットのみ入力した際のエラーメッセージと終了ステータスが特殊 (対応不要)
bash-3.2$ .
bash: .: filename argument required
.: usage: . filename [arguments]
bash-3.2$ echo $?
2
  • No.10 ▼exitした場合、直前の終了ステータスが$?に入る
bash-3.2$ exit < aaa
bash: aaa: No such file or directory
bash-3.2$ exit
exit
bash-3.2$ echo $?
127
  • No.11 ▼cdに指定したパスが存在しない場合にOLDPWDが変わってしまう(bashだと変わらない)
bash-3.2$ export
declare -x OLDPWD="/Users/kefujiwa/Work"
declare -x PWD="/Users/kefujiwa"
declare -x SHLVL="1"

bash-3.2$ cd aaaaaa
bash: cd: aaaaaa: No such file or directory

bash-3.2$ export
declare -x OLDPWD="/Users/kefujiwa/Work"
declare -x PWD="/Users/kefujiwa"
declare -x SHLVL="1"

No.1は環境変数の展開のタイミングを変えないとできなそうだね。
読み込みのタイミングで展開しているようにみえるのだけど 🤔
環境変数展開のタイミングはNo.6にも影響しそうな内容ですね

No.9ですが、.は組み込みコマンドに当たるので対応不要だと思います。
man bashでSHELL BUILTIN COMMANDSの項目の一番最初に記載があります。
実際はsourceと等価のようです。
help .で説明が出てくるので、ビルトインコマンドとしています。

bash-3.2$ help .
.: . filename [arguments]
    Read and execute commands from FILENAME and return.  The pathnames
    in $PATH are used to find the directory containing FILENAME.  If any
    ARGUMENTS are supplied, they become the positional parameters when
    FILENAME is executed.
bash-3.2$ help source
source: source filename [arguments]
    Read and execute commands from FILENAME and return.  The pathnames
    in $PATH are used to find the directory containing FILENAME.  If any
    ARGUMENTS are supplied, they become the positional parameters when
    FILENAME is executed.

@kefujiwa
PRにissueを含めると全て完了していなくても閉じてしまうみたいです。
PRに入れたいけど、完了にしたくない時はどうしましょうね。
issueを細かく分けるのは一つだとは思うのですが、わざわざissue立てるのめんどくさいですよね。

@tkomatsu
そうだったんですね!知らなかった、、
reopenしていただきありがとうございます!

本来なら細かく分けるべきなのかな、、
でも確かにめんどくさい笑
後、リスト形式で保持する方がパッと見てわかりやすいのもあるので、issueが完了していない場合はPRにissueを含めないようにします。。