Modifier le répertoire de travail dans mon contexte de shell actuel lors de l’exécution du script Node

J’essaie de changer le répertoire de travail de mon script Node.js lorsqu’il est exécuté à partir d’un script bin. J’ai quelque chose comme ceci:

#!/usr/bin/env node process.chdir('/Users') 

Lorsque je lance ensuite ce fichier avec ./bin/nodefile , il se ./bin/nodefile , mais le répertoire de travail du contexte actuel du shell n’a pas changé. J’ai également essayé des shelljs , mais cela ne fonctionne pas non plus.

Quelle est la meilleure façon de procéder? Je comprends que cela fonctionne, mais c’est juste dans un processus séparé.

La manière correcte de changer de répertoire est en fait avec process.chdir(directory) . Voici un exemple de la documentation :

 console.log('Starting directory: ' + process.cwd()); try { process.chdir('/tmp'); console.log('New directory: ' + process.cwd()); } catch (err) { console.log('chdir: ' + err); } 

Ceci est également testable dans la REPL Node.js:

 [monitor@s2 ~]$ node > process.cwd() '/home/monitor' > process.chdir('../'); undefined > process.cwd(); '/home' 

Il n’existe pas de méthode intégrée permettant à Node de modifier le CWD du shell sousjacent exécutant le processus Node.

Vous pouvez modifier le répertoire de travail actuel du processus Node via la commande process.chdir() .

 var process = require('process'); process.chdir('../'); 

Lorsque le processus Node existe, vous vous retrouverez dans le CWD dans lequel vous avez démarré le processus.

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 en ligne de commande et que vous exécutez votre script Node, votre processus actuel ( bash , zsh , peu importe) génère un nouveau processus qui possède son propre environnement, généralement une copie de votre environnement actuel (il est possible de le modifier via les appels système, mais cela dépasse le cadre de cette réponse), ce qui permet à ce processus de faire tout ce qu’il doit faire dans un isolement complet. Lorsque le sous-processus se termine, le contrôle est renvoyé au processus de votre shell, où l’environnement n’a pas été affecté.

Il y a beaucoup de raisons à cela, mais pour un, imaginez que vous ayez exécuté un script en arrière-plan (via ./foo.js & ) et, au fur et à mesure, il a commencé à modifier votre répertoire de travail ou à remplacer votre PATH . Ce serait un cauchemar.

Si vous devez effectuer certaines actions nécessitant de modifier votre répertoire de travail de votre shell, vous devrez écrire une fonction dans votre shell. Par exemple, si vous utilisez Bash, vous pouvez le mettre 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 devez effectuer des tâches plus complexes, vous pouvez toujours appeler votre script nodejs à partir de cette fonction.

C’est la seule façon d’accomplir ce que vous essayez de faire.

Réponse courte: pas de moyen (facile?), Mais vous pouvez faire quelque chose qui réponde à vos besoins.

J’ai fait un outil similaire (une petite commande qui donne une description d’un projet, définit l’environnement, les chemins, les répertoires, etc.). Ce que je fais, c’est de tout configurer, puis de créer un shell avec:

 spawn('bash', ['-i'], { cwd: new_cwd, env: new_env, stdio: 'inherit' }); 

Après l’exécution, vous serez sur un shell avec le nouveau répertoire (et dans mon cas, l’environnement). Bien sûr, vous pouvez changer bash pour n’importe quel shell que vous préférez. Les principales différences avec ce que vous avez initialement demandé sont les suivantes:

  • Il y a un processus supplémentaire, alors …
  • vous devez écrire ‘exit’ pour revenir, puis …
  • après avoir existé, tous les changements sont annulés.

Cependant, pour moi, ces différences sont souhaitables.