web-dev-qa-db-fra.com

Changer le répertoire de travail dans mon contexte 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 ce qui suit:

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

Quand j’exécute ensuite ce fichier avec ./bin/nodefile, il se ferme, mais le répertoire de travail du contexte Shell actuel n’a pas changé. J'ai aussi essayé shelljs , mais cela ne fonctionne pas non plus.

Quelle est la meilleure façon de procéder? Je comprends que cela fonctionne, mais il s’agit simplement d’un processus distinct.

94
Jonovono

La bonne façon de changer de répertoire est en fait avec process.chdir(directory). Voici un exemple tiré de 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 le REPL Node.js:

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

Il n'y a pas de méthode intégrée pour Node) pour modifier le CWD du Shell sous-jacent exécutant le Node processus.

Vous pouvez modifier le répertoire de travail actuel du processus de nœud 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.

31
dthree

Ce que vous essayez de faire n'est pas possible. En effet, 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 que vous allez exécuter votre script Node, votre processus actuel (bash, zsh, peu importe)) génère un nouveau processus qui a c'est son propre environnement, généralement une copie de votre environnement actuel (il est possible de le modifier via des 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 en isolation complète. , 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 imaginons que vous avez exécuté un script en arrière-plan (via ./foo.js &) et pendant son exécution, il a commencé à modifier votre répertoire de travail ou à remplacer votre PATH. Ce serait un cauchemar.

Si vous devez effectuer certaines opérations nécessitant la modification de votre répertoire de travail de votre shell, vous devez é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 également faire des choses plus complexes, vous pouvez toujours appeler votre script nodejs à partir de cette fonction.

C'est la seule façon dont vous pouvez accomplir ce que vous essayez de faire.

13
Spike Grobstein

Réponse courte: non (facile?), Mais vous pouvez faire quelque chose qui vous convient.

J'ai créé un outil similaire (une petite commande qui, à partir d'une description d'un projet, définit un environnement, des chemins, des répertoires, etc.). Ce que je fais est de tout configurer puis de créer un Shell avec:

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

Après exécution, vous serez sur un shell avec le nouveau répertoire (et, dans mon cas, l'environnement). Bien sûr, vous pouvez modifier bash selon le type de 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 'sortie' pour revenir, puis ...
  • après avoir existé, toutes les modifications sont annulées.

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

8
Evolopment