tkomatsu / minishell

my own shell like bash
MIT License
3 stars 0 forks source link

dquoteの展開タイミング #125

Closed tkomatsu closed 3 years ago

tkomatsu commented 3 years ago
minishell$ export ECHO=" echo    "
minishell$ $ECHO 1
minish: : command not found

ダブルクォートの展開の後にスペースが消されているようで、このような結果になっています。 bashだと実行できるので修正が必要かもしれません。

kefujiwa commented 3 years ago

確認します!

kefujiwa commented 3 years ago

いろいろ試した結果をメモ。

minishell$ export ECHO="echo      "
minishell$ $ECHO 1
1

minishell$ export ECHO="    echo    aa  "
minishell$ $ECHO
minish: : command not found

minishell$ export ECHO="     echo      "
minishell$ "$ECHO" 1
minish:      echo      : command not found

minishell$ export ECHO="cho 1"
minishell$ e$ECHO
1
bash-3.2$ export ECHO="     cho    1   "
bash-3.2$ e$ECHO
bash: e: command not found

bash-3.2$ export ECHO="cho  1   "
bash-3.2$ e$ECHO
1
kefujiwa commented 3 years ago

原因はここみたいです。

  1. 基本的にヌル文字トークンはNULLポインタに変えて、token_to_args.cで無視するようにしている。
  2. 以下の処理でヌル文字トークンのヌルポ変換を変数展開前に行ってしまっている。
  3. 2の結果、変数展開後に発生したヌル文字のトークンがヌルポに変換されない。
  4. 3の結果、token_to_args.cでヌル文字のトークンが紛れて、argsに渡される。 https://github.com/tkomatsu/minishell/blob/af415b2241af7f903d364ecc2da7953e08811ceb/srcs/parse/expand_tokens.c#L61-L68
kefujiwa commented 3 years ago

以下のケースに対応するため、安直に「ヌル文字トークンのヌルポ変換処理」をexpand_token後に置き換える対応はできない。

exit ""
echo "" "" a
tkomatsu commented 3 years ago

コマンドの実行時に先頭の文字列はisspace()をスキップするようにするのはなしかな?

tkomatsu commented 3 years ago

うまくいかぬ、、、、