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?
There are two ways you can get the current directory in NodeJS: Using the special variable __dirname. Using the built-in method process. cwd()
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.
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));
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With