命令行上的输入在什么时候被解析为node.js中的process.argv?

时间:2013-12-13 18:02:47

标签: javascript c++ c node.js shell

我编写了一个接受命令行输入的应用程序,但输入不是来自bash或任何其他shell。我的意思是我通过另一种方式获得用户输入,最后我得到了一个字符串。如果这个输入像普通命令一样通过命令行,那么节点就会神奇地将命令行参数解析为process.argv的正确数组。

乍一看复制这种行为似乎很简单,因为这只是str.split(' ')的问题吗?好吧不太好。 argv魔法会对输入进行一些预处理,确保"hello there"之类的内容最终成为一个数组项而不是两个因为引号。构建这个数组可能还有其他一些我不知道的事情。

我不知道是否试图通过反复试验来复制这种逻辑,我想知道你是否有人能指出我这个逻辑发生的地方。我不知道节点项目里面定义了这个process.argv数组。我尝试搜索源代码,但我不知道我在寻找什么。任何人都可以指出我的逻辑生活在哪里吗?我想复制它,以便我可以确信输入的解析方式与shell / node完全相同。

更新

我想要的就是数组解析。我不需要以任何其他方式解释字符串中的任何文本。我只想取一个字符串并将其分解为节点作为process.argv向我公开的完全相同的数组。我只是希望找到这个解析逻辑,然后将其复制或移植到JavaScript中。

一旦我拥有了数组,我就通过一个选项解析器库(yargs,一个optimist的分支)来运行它。选项解析器不理解字符串输入,只理解数组。如果我尝试传入process.argv,这很方便,但如果我需要自己将字符串转换为数组,则不太方便。

2 个答案:

答案 0 :(得分:2)

您所指的处理通常来自shell,例如bash,并且远非微不足道。在甚至调用NodeJS之前发生;也就是说,它发生在 about 的shell上,以执行NodeJS。

目前还不完全清楚你要做的是什么,但如果你所做的输入是来自一个受信任的用户,那么你可以使用child_process.exec运行命令,该命令将命令传递给外壳用于解释。有关详细信息,请参阅http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback,包括使用glob扩展和管道的示例。

但是,如果该命令不可信任(例如,您可能不想允许管道?),那么最好定义受限制的可接受语法并解析它。

答案 1 :(得分:0)

我正在寻找类似的东西,我正在考虑在子进程中执行另一个脚本,输出args并捕获它。

args bash脚本名为'args',只是:

#!/usr/bin/env node
console.log(JSON.stringify(process.argv));

主bash脚本(在同一目录中)如下所示:

var exampleString = "foo bar 'blah blah'";
var exec = require('child_process').exec;

exec(__dirname+'/args '+exampleString, function(error, stdout, stderr){
  var args = JSON.parse(stdout);
  // args now split
  console.log(args);
});

这给了你:

[ 'node',
'/Users/.../args',
'foo',
'bar',
'blah blah' ]

这对我有用,但我还没有非常认真地尝试过它。