如何从nodejs子进程获取cwd(当前工作目录)(在windows和linuxish中)

时间:2013-04-11 01:40:48

标签: node.js process

我正在尝试通过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) {
  });
});

我该怎么做?

4 个答案:

答案 0 :(得分:36)

以父级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);
});

更新:如果你想检索孩子的cwd:

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

答案 1 :(得分:20)

如果您想获取当前工作目录而不依赖于特定于操作系统的命令行实用程序,则可以使用"经过测试的" shelljs库为你抽象这些东西,同时使用子进程。

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

如果您拥有它,变量cwd将保存您当前的工作目录,无论您是在Linux,Windows还是freebsd上。

答案 2 :(得分:2)

只是想一想,如果您知道子进程的PID,并且安装了pwdx(可能在linux上),您可以从节点执行该命令以获取子进程的cwd。

答案 3 :(得分:1)

我认为最好的办法是在调用options.cwd之间操纵exec。在exec回调this.pwdthis.cwd可能会为您的实施提供杠杆。