命令行上的输入在什么时候解析为 node.js 中的 process.argv
At what point is the input on the command line parsed into process.argv in node.js?
我写了一个接受命令行输入的应用程序,除了输入不是来自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' ]
这对我有用,但我还没有认真尝试过。
- 在 ubuntu 上安装 node js pulsar 客户端
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 在 node.js 中将缓冲区从 C++ 转换为 UTF-8 字符串
- 使用 Node.js N-API 调用 C 函数时,不会显示预期的输出
- 如何使用 v8 本机插件将 C++ 数组交付到 Node.js
- C++ 和 node.js 之间的 RSA 加密
- node.js Nan:在函数C++调用 JavaScript 回调
- 迭代 Napi::对象属性(键)在 Node.js C++ N-API 中
- 上传大文件并解析时使用 Node.js v10.15.1 时出现致命错误
- 如何在 Node.js 中解压缩 c# 打包结构
- 使用 Node.js 调用child_process与从 C 调用子进程并创建C++绑定以从 node.js 调用
- 我们如何访问 Node.js 应用程序之外的内存?
- 我正在c 中的buidling node.js绑定
- 以有效的方式从 Node .js运行 C 或C++代码
- node.js:如何从C 模块中产生
- 如何编译 node.js for CentOS 6.10 (库问题)
- 如何使用 Node.js 开发一个侦听器来接收许多车辆跟踪数据(通过 TCP)
- 使用 N-API 将数据流式传输到 Node.js C++ 插件中
- 在node.js addon中阻止呼叫
- Node.js与C++的集成