faboussard / 42_minishell

1 stars 0 forks source link

Echo : problèmes d'écriture #66

Closed melobern closed 5 months ago

melobern commented 5 months ago

MINISHELL

>>>  Minishell>$ cat cat
coucou
>>>  Minishell>$ echo miaou > cat
miaou > cat
>>>  Minishell>$ cat cat
coucou

BASH

bash-5.2$ echo miaou > cat
bash-5.2$ cat cat
miaou
melobern commented 5 months ago

Après changement du code (voir branche builtins), echo ne redirige pas vers le fichier et print dans l'entrée standard. Fix à venir : appeler exec builtin directement dans exec et pas dans le main.

>>>  Minishell>$ echo ouaf > dog
ouaf
>>>  Minishell>$ cat dog
cat: dog: No such file or directory
melobern commented 5 months ago

Fonction + main + exec changés. Par contre, il faut que je vois comment les commandes de la process list sont qualifiés en builtin.

>>>  Minishell>$ echo miaou > cat
>>>  Minishell>$ cat cat
miaou
>>>  Minishell>$ echo ouaf > cat
>>>  Minishell>$ cat cat
ouaf
>>>  Minishell>$ echo miaou > cat
>>>  Minishell>$ cat cat
miaou
melobern commented 5 months ago

Echo ne echo pas si on met un infile : dans bash, il echo meme s'il y a un infile.

BASH

mbernard@z3r8p3:~/sgoinfre/42_minishell.c$ < Makefile echo

mbernard@z3r8p3:~/sgoinfre/42_minishell.c$ < Makefile echo prout
prout

MINISHELL

>>>  Minishell>$ < Makefile echo

>>>  Minishell>$ < Makefile echo prout
melobern commented 5 months ago

Commande modifiée : le paramètre utilisé n'est plus la liste de tokens mais la cmd_table, qui fonctionne beaucoup mieux puisqu'elle ne contient QUE ses arguments.

Les builtins devraient prendre cmd_table comme paramètre plutôt que la liste de tokens, à l'instar des commandes originelles.

int ft_echo(char **cmd_table)
{
    bool            flag;
    size_t i;

    i = 1;
    flag = 0;
    while (cmd_table[i] && check_n_arg(cmd_table[i]))
    {
        flag = 1;
        i++;
    }
   while (cmd_table[i])
   {
    if (printf("%s", cmd_table[i]) == -1)
        return (EXIT_FAILURE);
    i++;
    if (cmd_table[i] && printf(" ") == -1)
        return (EXIT_FAILURE);
    }
    if (flag == 0 && printf("\n") == -1)
        return (EXIT_FAILURE);
    return (EXIT_SUCCESS);
}

La fonction fonctionne très bien ainsi.