我编写了一个接受命令行输入的应用程序,但输入不是来自bash或任何其他shell。我的意思是我通过另一种方式获得用户输入,最后我得到了一个字符串。如果这个输入像普通命令一样通过命令行,那么节点就会神奇地将命令行参数解析为process.argv
的正确数组。
乍一看复制这种行为似乎很简单,因为这只是str.split(' ')
的问题吗?好吧不太好。 argv
魔法会对输入进行一些预处理,确保"hello there"
之类的内容最终成为一个数组项而不是两个因为引号。构建这个数组可能还有其他一些我不知道的事情。
我不知道是否试图通过反复试验来复制这种逻辑,我想知道你是否有人能指出我这个逻辑发生的地方。我不知道节点项目里面定义了这个process.argv
数组。我尝试搜索源代码,但我不知道我在寻找什么。任何人都可以指出我的逻辑生活在哪里吗?我想复制它,以便我可以确信输入的解析方式与shell / node完全相同。
我想要的就是数组解析。我不需要以任何其他方式解释字符串中的任何文本。我只想取一个字符串并将其分解为节点作为process.argv
向我公开的完全相同的数组。我只是希望找到这个解析逻辑,然后将其复制或移植到JavaScript中。
一旦我拥有了数组,我就通过一个选项解析器库(yargs,一个optimist的分支)来运行它。选项解析器不理解字符串输入,只理解数组。如果我尝试传入process.argv
,这很方便,但如果我需要自己将字符串转换为数组,则不太方便。
答案 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' ]
这对我有用,但我还没有非常认真地尝试过它。