Подтвердить что ты не робот

Как получить cwd (текущий рабочий каталог) из дочернего процесса nodejs (как в windows, так и в linuxish)

Я пытаюсь запустить script через nodejs, который делает:

cd ..
doSomethingThere[]

Однако для этого мне нужно выполнить несколько дочерних процессов и переносить состояние среды между этими процессами. Я бы хотел:

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

или по крайней мере:

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

Как я могу это сделать?

4b9b3361

Ответ 1

чтобы запустить дочерний с родительским dir как 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);
});

Обновить: если вы хотите получить дочерний cdd:

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 child don't change it 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));     

Ответ 2

Если вы хотите получить текущую рабочую директорию, не обращаясь к утилитам командной строки конкретной ОС, вы можете использовать "тестируемую битками" библиотеку shelljs, которая абстрагирует эти вещи для вас, а под использованием дочерних процессов.

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

Там у вас есть переменная cwd содержит текущий рабочий каталог, независимо от того, работаете ли вы в Linux, Windows или freebsd.

Ответ 3

Просто подумайте, если вы знаете ПИД-процесс дочернего процесса и установите pwdx (вероятно, в Linux), вы можете выполнить это команды из node, чтобы получить дочерний cdd.

Ответ 4

Я думаю, что лучшим вариантом является управление options.cwd между вызовами exec. в exec обратный вызов this.pwd и this.cwd может дать вам рычаги для ваших реализаций.