Ce que vous essayez de faire n'est pas possible. La raison en est que dans un système POSIX (Linux, OSX, etc.), un processus enfant ne peut pas modifier l'environnement d'un processus parent. Cela inclut la modification du répertoire de travail et des variables d'environnement du processus parent.
Lorsque vous êtes sur la ligne de commande et vous allez exécuter votre script nœud, votre processus actuel ( bash
, zsh
, peu importe) engendre un nouveau processus qui a son propre environnement, en général une copie de votre environnement actuel (il est possible de changer cela via des appels système ; mais cela dépasse la portée de cette réponse), permettant à ce processus de faire tout ce qu'il doit faire dans un isolement complet. Lorsque le sous-processus se termine, le contrôle est rendu au processus de votre shell, où l'environnement n'a pas été affecté.
Il y a beaucoup de raisons à cela, mais d'une part, imaginez que vous avez exécuté un script en arrière-plan (via ./foo.js &
) et qu'il a commencé à changer votre répertoire de travail ou à remplacer votre PATH
. Ce serait un cauchemar.
Si vous devez effectuer certaines actions qui nécessitent de changer le répertoire de travail de votre shell, vous devrez écrire une fonction dans votre shell. Par exemple, si vous exécutez Bash, vous pouvez mettre ceci dans votre ~/.bash_profile
:
do_cool_thing() {
cd "/Users"
echo "Hey, I'm in $PWD"
}
et puis cette chose cool est faisable:
$ pwd
/Users/spike
$ do_cool_thing
Hey, I'm in /Users
$ pwd
/Users
Si vous avez besoin de faire des choses plus complexes en plus, vous pouvez toujours appeler votre script nodejs depuis cette fonction.
C'est la seule façon d'accomplir ce que vous essayez de faire.