回声忽略child_process.exec()中的标志

当我在bash中直接键入echo -n foo ,它按预期工作,并打印foo而没有任何拖尾的新行。

但是,我写了下面的代码来使用child_process.exec()方法打印一些文本;

 var exec = require('child_process').exec; exec("echo -n foo", function(error, stdout, stderr) { console.log(stdout); } ); 

但是, -n标志不能按预期方式工作,而是会打印-n foo后跟一个空行。

更新:我知道这个问题只发生在OS X,我已经尝试了相同的脚本在Ubuntu上,它的工作原理。

在Linux上至less可以使用节点v0.10.30。

这个:

 var exec = require('child_process').exec; exec('echo -n foo', function(error, stdout, stderr) { console.dir(stdout); }); 

输出:

 “富”

但是,在Windows上,您所描述的行为确实存在,但这是因为Windows的echo命令与* nix不一样(所以它与命令之后的内容完全相同)。

它也不能在OS X上工作的原因是(从man echo ):

     有些shell可能会提供一个类似或标识的内置回显命令,
     对这个实用程序很有帮助。 最值得注意的是,sh(1)中的内build回声没有
     接受-n选项。

当你调用exec() ,节点在* nix平台上产生/bin/sh -c "<command string>" 。 因此(在手册页中指出)OS /bin/sh X上的/bin/sh不支持echo -n ,这会导致您看到的输出。 然而,它从terminal工作,因为该用户的默认shell不是/bin/sh但可能/bin/bash ,它支持echo -n 。 它也适用于Linux,因为大多数系统都有/bin/sh指向/bin/bash或其他一些支持echo -n shell。

所以解决办法是改变命令强制使用echo二进制代替内置shell的echo

 var exec = require('child_process').exec; exec('`which echo` -n foo', function(error, stdout, stderr) { console.dir(stdout); }); 

或者像这样使用spawn()

 var spawn = require('child_process').spawn, p = spawn('echo', ['-n', 'foo']), stdout = ''; p.stdout.on('data', function(d) { stdout += d; }); p.stderr.resume(); p.on('close', function() { console.dir(stdout); }); 

或者如果你想继续使用exec()而不改变代码,那么把/bin/sh作为符号链接到/bin/bash

JavaScript console.log函数将\n换行符附加到一个string。 如果你想打印一个没有换行符的string,你可以这样做:

 var exec = require('child_process').exec; exec("echo -n foo", function(error, stdout, stderr) { process.stdout.write(stdout); } );