Как получить 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) {
});
});
Как я могу это сделать?
Ответы
Ответ 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
может дать вам рычаги для ваших реализаций.