【问题标题】:Node.js spawn 'echo $(python --version)'Node.js 产生'echo $(python --version)'
【发布时间】:2016-12-16 00:08:45
【问题描述】:

我想使用 node.js 来生成 echo $(python --version),如果我把它放到我的终端中它工作没问题,我会得到类似的东西

Python 2.7.12

但如果我使用以下代码:

var spawn = require('child_process').spawn
var child = spawn('echo', ['$(python --version)'])
child.stdout.on('data', function(b){
    console.log(b.toString())
})

我只是将字符串文字回显给我:

$(python --version)

如何转义参数以正确生成,以便获得正确的输出。

编辑:我特别想使用 spawn 和 echo,我想知道是否有解决方案可以正确转义 spawn 参数...

【问题讨论】:

  • 这是因为$() 是一个bash 运算符,而child_process 使用的是sh 而不是bash。请参阅stackoverflow.com/questions/32952410/… 在使用 child_process 时设置您的 shell。
  • 当您在 shell 中运行 echo $(python --version) 时,回显几乎毫无用处。由于python --version 不会向标准输出输出任何内容,因此您只是在运行python --version,然后在不带参数的情况下运行echo。这相当于做$(python --version); echo,这意味着回显只是打印一个换行符。

标签: javascript node.js spawn stringescapeutils


【解决方案1】:

这应该可以帮助你。

var exec = require('child_process').exec;
exec('python --version', function(error, stdout, stderr) {
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if (error !== null) {
  console.log('exec error: ' + error);
}
});

根据评论中的要求编辑:

var exec = require('child_process').exec;
exec('echo "Output goes here"', function(error, stdout) { //Replace echo with any other command.
    console.log(stdout);
});

输出:输出到这里。

可能想检查一下:How do I escape a string for a shell command in node?

【讨论】:

  • 我特别想使用'echo'而不是调用python本身......也许我应该在问题中指出,问题更多是关于在spawn中转义字符串而不是这个具体问题跨度>
【解决方案2】:

我意识到我在这里聚会已经很晚了,但是当我自己在寻找答案时:

我认为问题在于 spawn 命令默认不会在 shell 中运行(请参阅 Node.js Documentation)。我认为 Node.js 这样做是为了保护你,通过转义所有 shell 元字符,这就是你所经历的。如果将 shell 选项设置为 true,它将按需要工作,如下所示:

require('child_process').spawn('echo', ['$(python --version)'], {shell: true, stdio: 'inherit'});

注意:将 stdio 设置为从父进程继承意味着您不必自己记录 stdout :)

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 2014-09-25
    • 2020-10-02
    • 2021-03-17
    • 1970-01-01
    • 2020-05-23
    • 2013-11-22
    • 2017-08-11
    相关资源
    最近更新 更多