Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the cwd (current working directory) from a nodejs child process (in both windows and linuxish)

I'm trying to run a script via nodejs that does:

cd .. doSomethingThere[] 

However, to do this, I need to executed multiple child processes and carry over the environment state between those processes. What i'd like to do is:

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

or at very least:

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

How can I do this?

like image 470
B T Avatar asked Apr 11 '13 01:04

B T


People also ask

How do I get the current working directory in node JS?

There are two ways you can get the current directory in NodeJS: Using the special variable __dirname. Using the built-in method process. cwd()

How do I change the working directory in node JS?

The process. chdir() method is used for changing the current directory of the Node. js process. It will throw an exception if any error occurs or the process fails, but will not return any response on success.


2 Answers

to start child with parent dir as 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); }); 

Update: if you want to retrieve child's 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));      
like image 121
Andrey Sidorov Avatar answered Sep 20 '22 16:09

Andrey Sidorov


If you want to get the current working directory without resorting to OS specific command line utilities, you can use the "battled-tested" shelljs library that abstract these things for you, while underneath using child processes.

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

There you have it, the variable cwd holds your current working directory whether you're on Linux, Windows, or freebsd.

like image 24
surfbuds Avatar answered Sep 18 '22 16:09

surfbuds