Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
child_process: execFileSync stderr should inherit
Browse files Browse the repository at this point in the history
If you don't set your options.stdio for execSync and execFileSync
capture and write to stderr of the parent process by default.

Fixes #7110
  • Loading branch information
tjfontaine authored and indutny committed Feb 18, 2014
1 parent 59baab2 commit 937e2e3
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 14 deletions.
8 changes: 6 additions & 2 deletions doc/api/child_process.markdown
Expand Up @@ -628,7 +628,9 @@ process has exited.
* `cwd` {String} Current working directory of the child process
* `input` {String|Buffer} The value which will be passed as stdin to the spawned process
- supplying this value will override `stdio[0]`
* `stdio` {Array} Child's stdio configuration.
* `stdio` {Array} Child's stdio configuration. (Default: 'pipe')
- `stderr` by default will be output to the parent process' stderr unless
`stdio` is specified
* `env` {Object} Environment key-value pairs
* `uid` {Number} Sets the user identity of the process. (See setuid(2).)
* `gid` {Number} Sets the group identity of the process. (See setgid(2).)
Expand Down Expand Up @@ -656,7 +658,9 @@ throw. The `Error` object will contain the entire result from
* `cwd` {String} Current working directory of the child process
* `input` {String|Buffer} The value which will be passed as stdin to the spawned process
- supplying this value will override `stdio[0]`
* `stdio` {Array} Child's stdio configuration.
* `stdio` {Array} Child's stdio configuration. (Default: 'pipe')
- `stderr` by default will be output to the parent process' stderr unless
`stdio` is specified
* `env` {Object} Environment key-value pairs
* `uid` {Number} Sets the user identity of the process. (See setuid(2).)
* `gid` {Number} Sets the group identity of the process. (See setgid(2).)
Expand Down
13 changes: 12 additions & 1 deletion lib/child_process.js
Expand Up @@ -1304,7 +1304,13 @@ function checkExecSyncError(ret) {


function execFileSync(/*command, options*/) {
var ret = spawnSync.apply(null, arguments);
var opts = normalizeSpawnArguments.apply(null, arguments);
var inheritStderr = !!!opts.options.stdio;

var ret = spawnSync(opts.file, opts.args.slice(1), opts.options);

if (inheritStderr)
process.stderr.write(ret.stderr);

var err = checkExecSyncError(ret);

Expand All @@ -1318,9 +1324,14 @@ exports.execFileSync = execFileSync;

function execSync(/*comand, options*/) {
var opts = normalizeExecArgs.apply(null, arguments);
var inheritStderr = opts.options ? !!!opts.options.stdio : true;

var ret = spawnSync(opts.file, opts.args, opts.options);
ret.cmd = opts.cmd;

if (inheritStderr)
process.stderr.write(ret.stderr);

var err = checkExecSyncError(ret);

if (err)
Expand Down
5 changes: 5 additions & 0 deletions test/common.js
Expand Up @@ -214,3 +214,8 @@ exports.mustCall = function(fn, expected) {
return fn.apply(this, arguments);
};
};

exports.checkSpawnSyncRet = function(ret) {
assert.strictEqual(ret.status, 0);
assert.strictEqual(ret.error, undefined);
};
17 changes: 6 additions & 11 deletions test/simple/test-child-process-spawnsync-input.js
Expand Up @@ -26,11 +26,6 @@ var util = require('util');

var spawnSync = require('child_process').spawnSync;

function checkRet(ret) {
assert.strictEqual(ret.status, 0);
assert.strictEqual(ret.error, undefined);
}

var msgOut = 'this is stdout';
var msgErr = 'this is stderr';

Expand All @@ -50,13 +45,13 @@ if (process.argv.indexOf('spawnchild') !== -1) {
switch (process.argv[3]) {
case '1':
ret = spawnSync(process.execPath, args, { stdio: 'inherit' });
checkRet(ret);
common.checkSpawnSyncRet(ret);
break;
case '2':
ret = spawnSync(process.execPath, args, {
stdio: ['inherit', 'inherit', 'inherit']
});
checkRet(ret);
common.checkSpawnSyncRet(ret);
break;
}
process.exit(0);
Expand All @@ -65,7 +60,7 @@ if (process.argv.indexOf('spawnchild') !== -1) {


function verifyBufOutput(ret) {
checkRet(ret);
common.checkSpawnSyncRet(ret);
assert.deepEqual(ret.stdout, msgOutBuf);
assert.deepEqual(ret.stderr, msgErrBuf);
}
Expand All @@ -89,7 +84,7 @@ options = {

ret = spawnSync('cat', [], options);

checkRet(ret);
common.checkSpawnSyncRet(ret);
assert.strictEqual(ret.stdout.toString('utf8'), options.input);
assert.strictEqual(ret.stderr.toString('utf8'), '');

Expand All @@ -99,15 +94,15 @@ options = {

ret = spawnSync('cat', [], options);

checkRet(ret);
common.checkSpawnSyncRet(ret);
assert.deepEqual(ret.stdout, options.input);
assert.deepEqual(ret.stderr, new Buffer(''));

verifyBufOutput(spawnSync(process.execPath, args));

ret = spawnSync(process.execPath, args, { encoding: 'utf8' });

checkRet(ret);
common.checkSpawnSyncRet(ret);
assert.strictEqual(ret.stdout, msgOut + '\n');
assert.strictEqual(ret.stderr, msgErr + '\n');

Expand Down

0 comments on commit 937e2e3

Please sign in to comment.