Comment faire que chdir () rest dans le répertoire spécifié après la fin du programme?

J’ai un programme qui appelle chdir () pour changer le cwd. Cependant, une fois le programme terminé, cwd revient au répertoire qui a appelé le programme au lieu de restr dans celui spécifié par l’appel de chdir (). J’ai créé un programme pour tester si chdir () est en train de changer dans le répertoire spécifié et j’ai constaté que chdir () faisait ce que je supposais: changer dans le répertoire spécifié pour la durée du programme puis revenir dans le répertoire qui exécutait le programme.

Voici le code pour le test:

#include  #include  #define NAME_MAX 100 int main(int argc, char **argv) { char buf[NAME_MAX]; char *path = argv[1]; if (chdir(path) == -1) { /* change cwd to path */ fprintf(stderr, "error: could not change to dir %s\n", path); return 1; } getcwd(buf, NAME_MAX); printf("CWD is: %s\n", buf); /* print cwd as obtained from getcwd() */ return 0; } 

et voici la sortie de mon terminal:

 john@ubuntu:~/C/cli$ pwd /home/john/C/cli john@ubuntu:~/C/cli$ mkdir foobar john@ubuntu:~/C/cli$ ./test.c foobar CWD is: /home/john/C/cli/foobar john@ubuntu:~/C/cli$ pwd /home/john/C/cli 

Ma question est donc la suivante: comment puis-je restr dans le répertoire spécifié dans l’appel à chdir () une fois le programme terminé? De plus, je suis sur Ubuntu 12.04 et comstackr avec gcc.

Certaines informations, y compris les valeurs des variables d’environnement et le répertoire de travail en cours, sont propagées des processus parents aux processus enfants, mais pas aux processus parents. Si un processus enfant (votre programme) appelle chdir ou définit ou modifie une variable d’environnement, cela affecte ce processus et ses enfants, mais ne peut pas affecter le parent.

C’est pourquoi chdir est une commande intégrée au shell. il ne peut pas être mis en œuvre en tant que programme séparé.

Si vous souhaitez qu’un programme modifie pour vous le répertoire actuel de votre shell, vous devez le faire indirectement. Par exemple, votre programme peut imprimer une commande cd et eval cette sortie dans votre shell. (Vous pouvez envelopper cela dans une fonction.)

Par exemple, si vous changez:

 chdir(path); 

à

 printf("cd %s\n", path); 

vous pouvez avoir une fonction shell:

 my_func() { eval `your_program` } 

et my_func changera le répertoire actuel de votre shell.

Ou vous pouvez mettre une commande cd directement dans la fonction ou dans un script que vous exécutez via . script-name . script-name ou . script-name source script-name plutôt que de l’exécuter.

Toutes ces solutions nécessitent que votre shell actuel exécute la commande cd elle-même (qui appelle en interne l’appel système chdir ).

L’environnement d’un processus ne peut pas être modifié par un autre processus. Cela inclut le répertoire de travail actuel. Donc non, vous ne pouvez pas restr dans le répertoire.