chdir (<répertoire>) ne change pas de répertoire après avoir quitté le shell

8

Je voulais créer un Cprogramme simple pour passer dans mon répertoire de projet. Son contenu est le suivant:

#include <unistd.h>
int main()
{
    chdir("/home/enedil/projects/algo");
    return 0;
}

Je l'ai compilé avec la commande suivante ( pro.cc'est son nom de fichier):

gcc pro.c -o /usr/local/bin/pro

Il n'y a eu ni erreur ni avertissement. Mais quand je l'exécute, il ne change pas de répertoire. Pourquoi?

enedil
la source
1
Vous pouvez utiliser un alias à la place -alias proj='cd ~/enedil/projects/algo'
Michael Durrant
@MichaelDurrant oh, tu voulais dire cd ~/projects/algo? C'est une idée!
enedil
1
C'est par conception!
Thorbjørn Ravn Andersen

Réponses:

15

Votre programme fait exactement ce que vous lui demandez de faire: il change le répertoire de travail pour lui - même à /home/enedil/projects/algo. Mais une fois qu'il se ferme, le répertoire de travail du shell est restauré.

Je suppose que ce que vous voulez réaliser est de changer le répertoire de travail du processus parent, c'est-à-dire le shell, sans avoir recours à un simple cd. Il existe une méthode , mais comme le dit son auteur: ne le faites pas.

Kempniu
la source
8
Nitpick, mais le répertoire de travail du shell n'est pas restauré, car il n'a jamais changé. Le shell est simplement un processus, tout comme le programme. Chaque programme a son propre répertoire de travail.
Patrick
1
@Patrick, c'est vrai. Conceptuellement, plus précis serait que votre répertoire de travail soit restauré, en ce que votre processus est "restauré" (est actif au premier plan).
Paul Draper
5

Le répertoire de travail actuel est local au processus. Donc, ce que vous voulez n'est pas possible.

vinc17
la source
1

Vous pouvez également utiliser la CDPATHvariable d'environnement. Comme expliqué dans man bash:

   CDPATH The search path for the cd command.  This is  a  colon-separated
          list  of  directories  in  which the shell looks for destination
          directories specified by the cd  command.   A  sample  value  is
          ".:~:/usr".

Ainsi, par exemple, vous pouvez ajouter cette ligne à votre ~/.profile:

CDPATH=~/projects

Vous pouvez maintenant exécuter à cd projectspartir de n'importe quel répertoire et passer à ~/projects.

BLIELI
la source
0

Pour ce faire pour le shell, utilisez la sourcecommande (aliasée à .). Il exécutera l'application dans le contexte du shell actuel plutôt que de créer un nouveau contexte de shell. C'est ainsi que vous pouvez également définir des variables d'environnement. Si vous remarquez tous les scripts de démarrage dans /etc/rc.dou /etc/init.d, vous verrez de nombreux scripts inclus par d'autres scripts avec la commande

. /etc/init.d/rcvars

Le .provoque le script /etc/init.d/rcvarsafin que tout ce qu'il change persiste dans l'environnement actuel.

Walter
la source
1
Vous ne pouvez pas exécuter un programme C de cette façon, seulement un script shell.
John Kugelman