为何npm start会忽略参数中转义后的反引号?
为什么npm start传递转义反引号时会被忽略?
这核心是命令解析的双重层级导致的,咱们一步步拆解:
1. 直接执行node时的解析流程
当你在终端敲node index.js test\`backticks`:
- 第一步是你的终端shell(比如bash/zsh)先处理转义:
\``会被解析成普通的反引号,所以最终传递给node的参数是test``backticks。 - node直接接收这个参数,不会再做shell语法解析,所以能原样输出
test``backticks,符合你的预期。
2. npm start时的解析流程
但用npm start -- test\`backticks`时,流程多了一层npm的shell调用:
- 第一步还是你的终端shell先处理转义,把
test\`backticks变成test``backticks`,传递给npm。 - npm在执行start脚本时,会把你传递的参数附加到脚本命令后面,拼成
node ./index.js test``backticks,然后交给系统默认shell(比如sh)再次执行这个完整命令。 - 这时候,这个shell会解析命令里的反引号:``是shell的命令替换语法,因为反引号里没有内容,执行后返回空字符串。所以最终传递给node的参数就变成了
test+ 空 +backticks→testbackticks,反引号就被“吃掉”了。
解决办法
想要让npm正确传递带反引号的参数,你需要绕过第二次shell的解析:
方法一:双重转义
给反引号做两次转义,让终端shell处理后,传递给npm的参数还保留一层转义:npm start -- test\\\`\\\`backticks终端shell解析后,传递给npm的是
test\`backticks,npm交给shell执行时,shell会把`解析成,最终node收到test``backticks。方法二:用单引号包裹参数
单引号里的内容不会被终端shell解析,直接原样传递给npm:npm start -- 'test``backticks'npm把参数传递给shell时,单引号会被移除,最终node收到的就是
test``backticks。
内容的提问来源于stack exchange,提问作者Evya
相关产品推荐
相关产品推荐

