io.js v1.0.3上では以下のようなコードで再現できる。
var spawnSync = require('child_process').spawnSync;
var ls;
var opts = {
stdio: 'inherit'
};
ls = spawnSync('ls', [], opts);
ls = spawnSync('ls', [], opts);
ls = spawnSync('ls', [], opts);
実行すると3回目の`spawnSync()`で例外を吐いて落ちる。
~/Desktop $ iojs test.js desktop.ini test.js desktop.ini test.js child_process.js:905 throw new TypeError('Incorrect value for stdio stream: ' + ^ TypeError: Incorrect value for stdio stream: { type: 'fd', fd: { type: 'fd', fd: 0 } } at child_process.js:905:13 at Array.reduce (native) at _validateStdio (child_process.js:829:17) at spawnSync (child_process.js:1251:19) at Object.<anonymous> (c:\Users\Kyo\Desktop\test.js:13:10) at Module._compile (module.js:446:26) at Object.Module._extensions..js (module.js:464:10) at Module.load (module.js:341:32) at Function.Module._load (module.js:296:12) at Function.Module.runMain (module.js:487:10)
io.jsではすぐ直りそう(Node.jsではstableに来る頃には直っていることだろう)だが、それまではoptions
はいちいち書いた方が無難だろう。具体的にはJSON.parse(JSON.stringify(opts))
とオブジェクトをクローンするテクニックを利用して指定するのが安定して良さそうだ。