回声忽略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); } );