如果我在 shell 中运行 echo "$(echo 'A\nB')"
,我会得到以下输出:
A\nB
如果我将相同的代码放入 NPM 脚本中:
"scripts": {
"example": "echo \"$(echo 'A\nB')\""
}
然后运行该脚本:npm run -s example
。
我得到一个输出,其中 \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
提交问题。
https://github.com/npm/npm/issues
<小时/>更新
npm@6.14.5 可以使用更少的斜杠...?为后代留下旧的答案,我没有检查它是否在所有版本上都发生了变化。
"scripts": {
"example": "echo \"$(echo 'A\\\\\\nB')\""
}
如果没有 JSON 转义,则为 echo "$(echo 'A\\\nB')"
。
关于node.js - 使用命令扩展运行 NPM 脚本会在返回结果之前解析结果 - 与 bash 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40607604/