Node.js使用-e参数执行含转义字符代码的问题
-e 参数的转义问题 这个问题的核心在于shell的转义规则和JavaScript的转义规则是两层独立的处理逻辑,你之前的尝试因为没处理好这两层转义的叠加,才出现了多余的斜杠。下面给你两种靠谱的解决方法:
方法1:用单引号包裹 -e 的代码内容(最推荐)
在bash、zsh这类主流shell里,单引号内部的字符不会被shell解析转义,这样你可以直接把原本的JavaScript代码放进去,不需要额外调整转义符:
node -e 'console.log("hello \"\"world")'
运行这个命令后,shell会原封不动地把console.log("hello \"\"world")传给Node.js,Node解析JS转义后,就会输出hello ""world,和你直接运行文件的效果完全一致。
方法2:用双引号包裹时做双重转义
如果你一定要用双引号包裹-e的内容,就得对JavaScript里的转义符做双重转义:
因为shell会先解析一层转义,所以JS里用来表示双引号的\",在shell里需要写成\\\"——shell会把\\解析成\,把\"解析成",最终传给Node的就是我们需要的\"。
正确的命令应该是:
node -e "console.log(\"hello \\\\\\\"\\\\\\\"world\")"
不过这个写法太繁琐,更简单的替代方式是在JS里用单引号包裹字符串,这样双引号就不需要转义了:
node -e "console.log('hello ""world')"
shell解析双引号后,传给Node的是console.log('hello ""world'),运行后直接输出hello ""world。
为什么你之前的尝试会出错?
你之前的命令node -e "console.log(\"hello \\\"\\\"world\")",shell解析后传给Node的其实是console.log("hello \"world")——因为\\\"\\\"被shell解析成了单个\"(而非\"\"),所以Node运行时,\"被解析成",剩下的一个\就被保留了,导致输出hello \world。
内容的提问来源于stack exchange,提问作者ThomasReggi




