it-swarm.com.de

Wie man das cwd (aktuelles Arbeitsverzeichnis) von einem Nodejs-Child-Prozess erhält (in Windows und Linux)

Ich versuche ein Skript über nodejs auszuführen, das Folgendes tut:

cd ..
doSomethingThere[]

Dazu muss ich jedoch mehrere untergeordnete Prozesse ausführen und den Umgebungsstatus zwischen diesen Prozessen übertragen. Was ich gerne machen würde ist:

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

oder zumindest:

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) {
  });
});

Wie kann ich das machen?

32
B T

kind mit Elternverzeichnis als cwd starten: 

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);
});

Update : Wenn Sie das cwd des Kindes abrufen möchten:

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

Wenn Sie das aktuelle Arbeitsverzeichnis abrufen möchten, ohne auf betriebssystemspezifische Befehlszeilenprogramme zurückgreifen zu müssen, können Sie die "geprüfte getestete" shelljs-Bibliothek verwenden, die diese Dinge für Sie abstrahiert, während Sie darunterliegende Prozesse verwenden.

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

Dort haben Sie es, die Variable cwd enthält Ihr aktuelles Arbeitsverzeichnis, egal, ob Sie Linux, Windows oder Freebsd verwenden.

20
surfbuds

Nur ein Gedanke, wenn Sie die PID des untergeordneten Prozesses kennen und pwdx installiert haben (wahrscheinlich unter Linux), können Sie diesen Befehl vom Knoten ausführen, um die cwd des Kindes zu erhalten.

2
Bret Copeland

Ich denke, die beste Wette ist, den options.cwd zwischen Aufrufen von exec zu manipulieren. In exec callback this.pwd und this.cwd können Sie Ihre Implementierungen beeinflussen. 

1
sjt003