Utilisation de la famille exec () pour exécuter la commande “cd”

Je sais que cd est un shell intégré, et je peux l’exécuter en utilisant system() .

Mais est-ce possible d’exécuter la commande cd avec la famille exec() , comme execvp() ?

Edit: Et je viens de remarquer que ce system("cd") n’a pas non plus de sens … Merci à tous.

exec charge un fichier exécutable et remplace l’image du programme en cours par celui-ci. Comme vous l’avez noté à juste titre, cd n’est pas un fichier exécutable, mais plutôt un shell intégré. L’exécutable que vous voulez exécuter est donc le shell lui-même. C’est ce que system() fait pour vous, mais si vous voulez être explicite à ce sujet, vous pouvez utiliser exec :

 execl("/bin/sh", "-c", "cd", (const char *)0); 

Comme cela remplace votre image de processus actuelle, vous devriez le faire après un nouveau processus.

Cependant, toute cette procédure n’a absolument aucun effet. Si vous voulez changer le répertoire dans votre processus actuel, utilisez chdir() .

Vous feriez mieux d’utiliser int chdir(const char *path); trouvé dans unistd.h .

Bien que, comme indiqué précédemment, le system("cd xxx") ne modifie pas le répertoire actuel de votre application, il n’est pas totalement inutile.

Vous pouvez toujours utiliser le statut de sortie du système pour savoir si le remplacement de votre répertoire actuel par celui indiqué indiquera le succès ou non.

De même, si vous aimez les solutions complexes, vous pouvez également procéder de la même façon avec fork / exec, soit avec exec /bin/sh -c cd xxx r /bin/sh -c cd xxx soit simplement /bin/cd xxx avec des systèmes d’exploitation fournissant un exécutable cd indépendant.

Je recommanderais cependant cet access("xxx", X_OK|R_OK) équivalent plus rapide et non excessif access("xxx", X_OK|R_OK)

Remarque: Tous les systèmes d’exploitation compatibles POSIX doivent fournir un exécutable indépendant sur CD. C’est au moins le cas avec Solaris , AIX , HP-UX et Mac OS / X.

Non, ce n’est pas le cas et cela ne servirait à rien. chdir (la fonction qui modifie le répertoire courant d’un processus) n’affecte que le processus qui l’appelle (et ses enfants). Cela n’affecte pas son parent en particulier.

exec cd n’a donc aucun sens, car le processus se terminerait immédiatement après avoir changé de répertoire.

(Vous pouvez exécuter quelque chose comme bash -c cd /tmp si vous le souhaitez vraiment, mais comme je l’ai dit, c’est infructueux.)

Quand un fork est créé, la variable d’environnement CWD (répertoire de travail actuel) est héritée du parent par l’enfant. cela n’affecte pas le parent. Par conséquent, le nouvel environnement est perdu.