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

At what point is the input on the command line parsed into process.argv in node.js?

本文关键字:node js 中的 argv process 输入 什么时候 命令行      更新时间:2023-10-16

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

乍一看,复制这种行为似乎很简单,因为这只是str.split(' ')的问题,对吧?嗯,不完全是。argv魔术对输入进行一些预处理,确保像"hello there"这样的东西最终成为一个数组项目,而不是两个,因为引号。构建这个数组可能还有其他我不知道的事情。

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

更新:

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

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

你所指的处理通常来自 shell,例如 bash,而且远非微不足道。这发生在调用 NodeJS 之前;也就是说,它发生在即将执行 NodeJS 的 shell 上。

目前还不完全清楚您要做什么,但是如果您获取的输入来自受信任的用户,那么您可以使用child_process.exec运行该命令,这会将命令传递给shell进行解释。有关详细信息,请参阅 http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback,包括使用 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' ]

这对我有用,但我还没有认真尝试过。