43

我正在尝试通过 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

4 回答 4

44

以父目录作为 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));     
于 2013-04-11T03:24:21.000 回答
24

如果您想在不使用操作系统特定的命令行实用程序的情况下获取当前工作目录,您可以使用“battled-tested”shelljs 库为您抽象这些内容,同时在下面使用子进程。

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

好了,变量 cwd 保存了您当前的工作目录,无论您是在 Linux、Windows 还是 freebsd 上。

于 2014-05-11T09:15:40.153 回答
2

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

于 2013-04-11T03:48:04.737 回答
0

我认为最好的选择是操纵options.cwdexec. 在exec回调中this.pwd,并this.cwd可能为您的实现提供杠杆作用。

于 2015-04-21T21:04:59.543 回答