diff --git a/doc/api/child_process.md b/doc/api/child_process.md index c88443e078b0a6..38c94dbf908025 100644 --- a/doc/api/child_process.md +++ b/doc/api/child_process.md @@ -437,6 +437,8 @@ If not given, the default is to inherit the current working directory. Use `env` to specify environment variables that will be visible to the new process, the default is [`process.env`][]. +`undefined` values in `env` will be ignored. + Example of running `ls -lh /usr`, capturing `stdout`, `stderr`, and the exit code: diff --git a/lib/child_process.js b/lib/child_process.js index d1c4d2f2903516..f2c1a0c237bd98 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -504,8 +504,11 @@ function normalizeSpawnArguments(file, args, options) { var env = options.env || process.env; var envPairs = []; - for (var key in env) { - envPairs.push(`${key}=${env[key]}`); + for (const key of Object.keys(env)) { + const value = env[key]; + if (value !== undefined) { + envPairs.push(`${key}=${value}`); + } } _convertCustomFds(options); diff --git a/test/parallel/test-child-process-env.js b/test/parallel/test-child-process-env.js index 4582c48fda5db1..5bd02c24badef5 100644 --- a/test/parallel/test-child-process-env.js +++ b/test/parallel/test-child-process-env.js @@ -22,11 +22,15 @@ 'use strict'; const common = require('../common'); const assert = require('assert'); +const os = require('os'); const spawn = require('child_process').spawn; const env = { - 'HELLO': 'WORLD' + 'HELLO': 'WORLD', + 'UNDEFINED': undefined, + 'NULL': null, + 'EMPTY': '' }; Object.setPrototypeOf(env, { 'FOO': 'BAR' @@ -53,5 +57,8 @@ child.stdout.on('data', function(chunk) { process.on('exit', function() { assert.ok(response.includes('HELLO=WORLD')); - assert.ok(response.includes('FOO=BAR')); + assert.ok(!response.includes('FOO=')); + assert.ok(!response.includes('UNDEFINED=undefined')); + assert.ok(response.includes('NULL=null')); + assert.ok(response.includes(`EMPTY=${os.EOL}`)); });