web-dev-qa-db-fra.com

Comment obtenir le cwd (répertoire de travail en cours) à partir d'un processus fils de nodejs (sous Windows et sous Linux)

J'essaie de lancer un script via nodejs qui:

cd ..
doSomethingThere[]

Cependant, pour ce faire, je dois exécuter plusieurs processus enfants et transférer l'état de l'environnement entre ces processus. Ce que j'aimerais faire, c'est:

var exec = require('child_process').exec;
var child1 = exec('cd ..', function (error, stdout, stderr) {
  var child2 = exec('cd ..', child1.environment, function (error, stdout, stderr) {
  });
});

ou du moins:

var exec = require('child_process').exec;
var child1 = exec('cd ..', function (error, stdout, stderr) {
  var child2 = exec('cd ..', {cwd: child1.process.cwd()}, function (error, stdout, stderr) {
  });
});

Comment puis-je faire ceci?

32
B T

pour commencer un enfant avec le répertoire parent comme cwd: 

var exec = require('child_process').exec;
var path = require('path')

var parentDir = path.resolve(process.cwd(), '..');
exec('doSomethingThere', {cwd: parentDir}, function (error, stdout, stderr) {
  // if you also want to change current process working directory:
  process.chdir(parentDir);
});

Mise à jour : si vous voulez récupérer le cwd de l'enfant:

var fs = require('fs');
var os = require('os');
var exec = require('child_process').exec;

function getCWD(pid, callback) {
  switch (os.type()) {
  case 'Linux':
    fs.readlink('/proc/' + pid + '/cwd', callback); break;
  case 'Darwin':
    exec('lsof -a -d cwd -p ' + pid + ' | tail -1 | awk \'{print $9}\'', callback);
    break;
  default:
    callback('unsupported OS');
  }
}

// start your child process
//    note that you can't do like this, as you launch Shell process 
//    and Shell's child don't change it's cwd:
// var child1 = exec('cd .. & sleep 1 && cd .. sleep 1');
var child1 = exec('some process that changes cwd using chdir syscall');

// watch it changing cwd:
var i = setInterval(getCWD.bind(null, child1.pid, console.log), 100);
child1.on('exit', clearInterval.bind(null, i));     
34
Andrey Sidorov

Si vous souhaitez obtenir le répertoire de travail actuel sans recourir à des utilitaires de ligne de commande spécifiques à un système d'exploitation, vous pouvez utiliser la bibliothèque shelljs "bataillée-testée" qui fait la synthèse de ces choses pour vous, tout en utilisant des processus enfants.

var sh = require("shelljs");
var cwd = sh.pwd();

La variable cwd contient votre répertoire de travail actuel, que vous soyez sous Linux, Windows ou freebsd.

20
surfbuds

Juste une pensée, si vous connaissez le PID du processus enfant et que vous avez pwdx installed (probablement sous Linux), vous pouvez exécuter cette commande à partir de node pour obtenir le cwd de l'enfant.

2
Bret Copeland

Je pense que le meilleur pari est de manipuler le options.cwd entre les appels à exec. in exec callback this.pwd et this.cwd peuvent vous donner un avantage pour vos implémentations. 

1
sjt003