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 :

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 .
$>
Ce que je trouve curieux c'est que la commande est bien envoyé , le ls est bien reconnu en /bin/ls .
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);
}