1

Node.js 有一个-e命令行开关来评估命令行上提供的代码,而不是在单独的脚本文件中。

奇怪的是,我在网上找不到它的官方文档,但如果你运行,节点可执行文件会自行记录它node --help

>node --help
Usage: node [options] [ -e script | script.js ] [arguments]
       node debug script.js [arguments]

Options:
  -v, --version         print Node.js version
  -e, --eval script     evaluate script
  -p, --print           evaluate script and print result

现在有几种在 JavaScript 中使用 Unicode 字面量的方法,似乎都以\u.

但无论我如何尝试使用 Unicode 文字引用或转义字符串,代码总是无法执行。都在官方 Node.js 和 JXcore 下。

节点

>node -e console.log('hello \u00A9')
[eval]:1
console.log('hello
            ^^^^^^

SyntaxError: Unexpected token ILLEGAL
    at Object.exports.runInThisContext (vm.js:53:16)
    at Object.<anonymous> ([eval]-wrapper:6:22)
    at Module._compile (module.js:435:26)
    at node.js:578:27
    at doNTCallback0 (node.js:419:9)
    at process._tickCallback (node.js:348:13)

JXcore

>jx -e console.log('hello \u{00A9}')
SyntaxError: unterminated string literal ([eval] 1:12)
    at  ([eval]-wrapper:6:8)
    at Module.prototype._compile (module.js:621:10)
    at evalScript (node.js:1054:18)
    at startup (node.js:419:7)
    at node.js:1604:3

我试过双倍\\和四倍\\\\。我尝试过单引号和双引号字符来分隔字符串。

(我只是在 Windows 下尝试这个,以防万一这在 *nix 下可以正常工作。)

4

1 回答 1

2

尝试

node -e "console.log('hello \u00A9')"

双引号确保它console.log('hello \u00A9')被解释为单个参数node

在您最初的尝试中,node看到后面有2 个参数-e(由内部的空格分隔'hello \u00A9'):console.log('hello\u00A9'),并且由于后面的第一个参数-e本身不是语法上有效的表达式,因此您遇到了语法错误。


背景:

包含要执行的 JavaScript 代码片段的script参数 (-e的 option-argument ) 必须是命令行上的一个不同参数,以便它可以与其他参数区分开来,例如传递给它的参数 ( [arguments])。

使具有嵌入空格的字符串作为参数不同的方法是将其作为一个整体引用

在 Windows 上,这通常使用引号完成,但最终取决于调用的程序来解释参数(在 shell 可能具有扩展标记之后,例如环境变量引用)。

由于单引号和双引号可以在 JavaScript 中互换使用,您甚至可以通过交换单引号和双引号来逃避:node -e 'console.log("hello \u00A9")'

(这绝对适用于 Unix,其中shell 本身将单引号字符串识别为不同的参数,并且所有程序都被传递一个解析参数数组而不是命令行来解释自己)。

于 2016-02-10T03:31:34.697 回答