Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 命令行上的输入在什么时候被解析为node.js中的process.argv?_Javascript_C++_C_Node.js_Shell - Fatal编程技术网

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

Javascript 命令行上的输入在什么时候被解析为node.js中的process.argv?,javascript,c++,c,node.js,shell,Javascript,C++,C,Node.js,Shell,我编写了一个接受命令行输入的应用程序,但输入不是来自bash或任何其他shell。我的意思是,我通过另一种方式获得用户输入,最后得到一个字符串。如果这个输入像普通一样通过命令行,那么node就会神奇地将命令行参数解析成process.argv中的一个适当数组 乍一看,复制这种行为似乎很简单,因为这只是一个str.split(“”)的问题,对吗?不完全是。argvmagic对输入进行了一些预处理,确保像“hello there”这样的东西由于引号而最终成为一个数组项,而不是两个数组项。它可能还做了

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

乍一看,复制这种行为似乎很简单,因为这只是一个
str.split(“”)
的问题,对吗?不完全是。
argv
magic对输入进行了一些预处理,确保像
“hello there”
这样的东西由于引号而最终成为一个数组项,而不是两个数组项。它可能还做了其他一些事情来构建这个阵列,我也不知道

我不想通过反复试验来复制这种逻辑,我想知道你们中是否有人能告诉我这种逻辑发生的地方。我不知道这个
进程.argv
数组在节点项目中的何处定义。我试着搜索来源,但我不知道我真正在寻找什么。有人能告诉我这种逻辑在哪里吗?我想复制它,这样我可以确信输入的解析方式与shell/节点的解析方式完全相同

更新: 这里我只需要数组解析。我不需要字符串中的任何文本以任何其他方式进行解释。我只想取一个字符串,将其拆分成与node作为
process.argv
向我公开的数组完全相同的数组。我只是希望找到这个解析逻辑并将其复制或移植到JavaScript中


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

您所指的处理通常来自shell,例如
bash
,这一点也不简单。这在NodeJS被调用之前就发生了;也就是说,它是由即将执行NodeJS的shell执行的

还不完全清楚您要做什么,但是如果您接受的输入是来自可信用户的,那么您可以使用
child\u process.exec
运行该命令,该命令将命令传递给shell进行解释。有关详细信息,请参见,包括使用glob扩展和管道的示例


但是,如果命令可能不可信(例如,可能您不想允许使用管道),那么最好定义一个受限的可接受语法并对其进行解析。

我希望做类似的事情,我正在考虑在输出参数的子进程中执行另一个脚本,并捕捉到这一点

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' ]

这对我来说是可行的,但我还没有认真尝试过。

我所要做的就是将一个简单字符串转换为位于
process.argv
的相同解析数组。不幸的是,这个输入不是来自可信的源,我无法将它直接传递给shell。您知道在哪里可以找到shell用于创建此数组的逻辑吗?我不需要解释命令/参数;我只需要以shell解析字符串的相同方式来解析字符串,并以
process.argv
中显示的相同数组结束。字符串中的实际文本不需要与shell中的实际命令相对应。更多详细信息:一旦获得了数组,我将通过选项解析器库(,一个分支)运行它。选项解析器不理解字符串输入,只理解数组。如果我试图传入
process.argv
,这很方便,但如果我需要自己将字符串转换为数组,则不太方便。您可以在shell的源代码中找到shell如何执行此操作的“逻辑”。例如,您可以在这里找到
bash
:我很感激,但我希望能找到源代码中发生这种情况的地方。我已经倾注了大量的源代码,但都没有用。Alex,我不太愿意这么说,因为我不知道你的全部背景,但这确实让我觉得有点误入歧途。Shell解析语法是非常神秘的,我认为如果有什么需要的话,最好是定义(并记录)一种在特定上下文中有意义的语法——例如,只处理引用的参数,而不处理文件名全局替换、变量替换、大括号扩展、进程管道、命令替换等等——并实现它。