【问题标题】:getting raw command line arguments in node.js在 node.js 中获取原始命令行参数
【发布时间】:2021-03-11 07:58:33
【问题描述】:

如何在 node.js 应用程序中获取原始命令行参数, 给出这个示例命令:

node forwardwithssh.js echo "hello arguments"

process.argv 将是 [ "node", "/path/to/forwardwith.js", "echo", "hello arguments" ]

并且没有办法从中重建原始的echo "hello arguments"(即join(" " 不会放回引号)。 我想要脚本名称后面的整个原始原始字符串。

使用"$*" 在 bash 脚本中很容易获得我想要的东西,是否有任何等效的方法可以在 node.js 中获得它?

注意:特别的目的是接收要在其他地方执行的命令(例如通过 ssh)

【问题讨论】:

  • 这个模块应该可以做你想做的:npmjs.org/package/minimist
  • 无法判断原始参数是否指定为"hello arguments"'hello arguments'hello\ arguments。这些在 bash 中都是一样的。您是否只想始终假设带有空格的 arg 最初是用双引号引起来的?很容易看出这个空间一定是被某种方式转义了,因为你得到一个 arg 而不是两个“hello arguments”。
  • 你可以引用你所有的参数process.argv.map(function(arg){ return '"' + arg + '"'; });。这会给你:"node" "forwardwithssh.js" "echo" "hello arguments",这在 bash 中与你的原始命令完全相同。
  • @BrianGlaz minimist 也有同样的问题,你可以在-- 之后看到参数也被解析了。 @Paulpro 我可以为所有内容添加引号,我想将原始参数作为要在其他地方执行的命令转发
  • bash 中的 @Paulpro "$*" 确实为您提供了确切的原始字符串(我需要它,因为它是另一个命令),而不仅仅是在任何地方加上引号

标签: node.js command-line


【解决方案1】:

将每个 args 用单引号括起来,并将每个 arg 中的单引号转义为 '\''

var cmd_string = process.argv.map( function(arg){
  return "'" + arg.replace(/'/g, "'\\''") + "'";
}).join(' ');

这会给你一个 cmd_string 包含:

'node' '/path/to/forwardwith.js' 'echo' 'hello arguments'

可以直接在另一个shell中运行。

【讨论】:

  • 我担心添加单引号在 shell 上不起作用,但你是对的,我现在想处理转义,并且能够记录原始命令......但是这似乎是最好的解决方案
  • 它不提供原始命令参数。 'node x.js y' 和 'node x.js "y"' 将给出相同的 process.argv。
  • @wandalen 在调用 node 之前,它们在 shell 中的评估相同。如果你想从 shell 中传递引号,你需要 node x.js \'y\'node x.js "'y'"
  • @Paulpro 的目标不是传递引号,而是获得不能由 shell 进行的原始调用。但是你写的是,我觉得在类 Unix 系统上是不可能的。 Windows 有GetCommandLine
猜你喜欢
  • 1970-01-01
  • 2017-02-24
  • 2014-08-29
  • 2021-01-20
  • 2012-06-05
  • 2016-02-17
  • 2015-08-28
  • 1970-01-01
相关资源
最近更新 更多