私は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) {
});
});
これどうやってするの?
親ディレクトリを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));
OS固有のコマンドラインユーティリティに頼らずに現在の作業ディレクトリを取得する場合は、子プロセスを使用しながら、これらのことを抽象化する「バトルテスト済み」shelljsライブラリを使用できます。
var sh = require("shelljs");
var cwd = sh.pwd();
Linux、Windows、またはfreebsdを使用している場合でも、変数cwdは現在の作業ディレクトリを保持します。
考えてみると、子プロセスのPIDを知っていて、 pwdx がインストールされている場合(Linuxの場合)、ノードからそのコマンドを実行して子のcwdを取得できます。
最善の策は、options.cwd
exec
の呼び出し間。 exec
コールバックthis.pwd
およびthis.cwd
は、実装に活用できる場合があります。