将带空格的字符串传递给节点 cli-parser
passing string with spaces to node cli-parser
var minimist = require("minimist")
const a = minimist(`executable --param "a b"`.split(' '))
console.log(a)
https://runkit.com/embed/57837xcuv5v0
实际输出:
Object {_: ["executable", "b\""], param: "\"a"}
预期输出:
Object {_: ["executable"], param: "a b"}
我在使用 yargs
和 commander
时也看到了相同的结果。
这很奇怪,因为 jest
正在使用 yargs
并开玩笑地接受以下命令:jest -t "test name with spaces"
根据您的示例代码,问题是您准备的字符串数组在解析器看到它之前已经打断了带空格的字符串:
$ node -e 'console.log(`executable --param "a b"`.split(" "))'
[ 'executable', '--param', '"a', 'b"' ]
手动设置参数时的一个简单解决方法是自己构造参数数组,而不是使用字符串和 split
,例如:
$ node -e 'console.log(["executable", "--param", "a b"])'
[ 'executable', '--param', 'a b' ]
或
const a = minimist(['executable', '--param', 'a b'])
如果您需要像 shell 那样将单个字符串分解为参数,Commander、Yargs 或 minimist 不会这样做。
你可以看看 https://www.npmjs.com/package/shell-quote 里面有一个解析命令。
var minimist = require("minimist")
const a = minimist(`executable --param "a b"`.split(' '))
console.log(a)
https://runkit.com/embed/57837xcuv5v0
实际输出:
Object {_: ["executable", "b\""], param: "\"a"}
预期输出:
Object {_: ["executable"], param: "a b"}
我在使用 yargs
和 commander
时也看到了相同的结果。
这很奇怪,因为 jest
正在使用 yargs
并开玩笑地接受以下命令:jest -t "test name with spaces"
根据您的示例代码,问题是您准备的字符串数组在解析器看到它之前已经打断了带空格的字符串:
$ node -e 'console.log(`executable --param "a b"`.split(" "))'
[ 'executable', '--param', '"a', 'b"' ]
手动设置参数时的一个简单解决方法是自己构造参数数组,而不是使用字符串和 split
,例如:
$ node -e 'console.log(["executable", "--param", "a b"])'
[ 'executable', '--param', 'a b' ]
或
const a = minimist(['executable', '--param', 'a b'])
如果您需要像 shell 那样将单个字符串分解为参数,Commander、Yargs 或 minimist 不会这样做。
你可以看看 https://www.npmjs.com/package/shell-quote 里面有一个解析命令。