Bonjours,
je travaille en ce moment sur un shell maison qui doit comporter plusieurs caractéristiques.
je rencontre un petit problème lier à l'éxecutions de diverses commandes,celles se trouvant dans /bin/ (pour linux).
en fait j'arrive sans soucis à les exécuter quand il n'y a pas d'espaces entre le prompt et la commande, seulement j'aimerais bien pouvoir utiliser la commande comme dans un shell normal : avec des espaces .
je vous montre un exemple de mon shell et ce qu'il affiche dans le cas d'espace entre le prompt et la commande :
Ce que je trouve curieux c'est que la commande est bien envoyé , le ls est bien reconnu en /bin/ls .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 $>ls -a affichage de cmd:[/bin/ls] // commande ls -a avec trois espaces, j'ai mis un printf a chaque fois pour voir quelle commande j'envoie. . .. getarg.o getcmd.o .git lib libmy.a Makefile malloc_and_free_funct.o minishell.o my.h mysh str.o $>ls affichage de cmd:[/bin/ls] getarg.o getcmd.o lib libmy.a Makefile malloc_and_free_funct.o minishell.o my.h mysh str.o $>/bin/ls affichage de cmd:[/bin/ls] getarg.o getcmd.o lib libmy.a Makefile malloc_and_free_funct.o minishell.o my.h mysh str.o $> ls affichage de cmd:[/bin/ls] /bin/ls: impossible d'accéder à 'ls': Aucun fichier ou dossier de ce type //la commande avec des espaces ne fonctionne pas et affiche ce message . $>
Je me demande si il n'y a pas un caractère invisible ou des caractères qui sont rajoutés au moment de l'execve..
je vous poste mon code n'hésitez pas à me poser des questions si besoins , Merci !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 void manage_process(char **av, char *cmd, int cc, char **envp) { pid_t pid; char *path; int error; int a; a = 0; pid = fork();//duplication du processus avec fork if (pid == 0) { av = getarg(cmd, cc, av); //recupération des arguments si il y en a cmd = getcmd(cmd, cc); //récupération propre de la commande // cmd[cc - 1] = '\0'; cmd = my_concat(cmd); //rajoute le path à la commande si celle ci est envoyé sans le path (ex: ls) av[0] = cmd; error = execve(cmd, av, envp); //éxecution de la commande cmd avec les arguments av if (error == -1) //gestion d'erreur ; prolème d'execve { write(1, "error: bad request.\n", 20); free(cmd); exit (0); } } else wait(NULL); }
Partager