Node.js 运行带有命令扩展的NPM脚本会在返回结果之前对其进行解析,这与bash不同

Node.js 运行带有命令扩展的NPM脚本会在返回结果之前对其进行解析,这与bash不同,node.js,bash,shell,npm,Node.js,Bash,Shell,Npm,如果在shell中运行echo“$(echo'A\nB')”,则会得到以下输出: A\nB 但是,如果我将相同的代码放在NPM脚本中: "scripts": { "example": "echo \"$(echo 'A\nB')\"" } 然后运行该脚本:npm run-s示例 我得到一个用实际新行替换的\n输出: A B 如何禁用对字符串的这种解释?为什么NPM对待命令扩展的方式不同于shell 这仅在命令扩展时发生:$(此处的某些命令)部分原因是npm的行为,部分原因是您正在JSO

如果在shell中运行
echo“$(echo'A\nB')”
,则会得到以下输出:

A\nB
但是,如果我将相同的代码放在NPM脚本中:

"scripts": {
  "example": "echo \"$(echo 'A\nB')\""
}
然后运行该脚本:
npm run-s示例

我得到一个用实际新行替换的
\n
输出:

A
B
如何禁用对字符串的这种解释?为什么NPM对待命令扩展的方式不同于shell


这仅在命令扩展时发生:
$(此处的某些命令)

部分原因是
npm
的行为,部分原因是您正在JSON文件中编写脚本

\n
是换行符的JSON转义序列

“echo\”$(echo'A\nB')\”
将作为以下内容传递给
npm

echo "$(echo 'A
B')"
但是,
npm
对换行符的处理肯定存在一些问题(可能与
\n
也是JS转义序列这一事实有关)

通过反复试验,我发现这是可行的:

"scripts": {
  "example": "echo \"$(echo 'A\\\\\\\\nB')\""
}
如果没有JSON转义,那将是
echo“$(echo'A\\\\nB')”

真奇怪。也许您应该向
npm
提交一个问题


更新 npm@6.14.5用更少的斜杠工作。。。?把旧答案留给后人,我并没有检查它是否在所有版本上都改变了

"scripts": {
  "example": "echo \"$(echo 'A\\\\\\nB')\""
}

如果没有JSON转义,那将是
echo“$(echo'A\\\nB')”

它似乎对待命令扩展与shell不同。因为shell中支持的
echo
开关在使用上述命令时会打印出来。有趣的是,由于它是json,感谢您的解释