【问题标题】:Running an NPM script with command expansion parses result before returning it - unlike bash运行带有命令扩展的 NPM 脚本会在返回结果之前对其进行解析 - 与 bash 不同
【发布时间】:2016-11-15 10:34:18
【问题描述】:

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

A\nB

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

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

然后运行该脚本:npm run -s example

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

A
B

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

这仅在命令扩展时发生:$(some command here)

【问题讨论】:

  • 它似乎确实以不同于 shell 的方式处理命令扩展。因为在 shell 中支持echo 的开关在使用上述内容时会被打印出来。

标签: node.js bash shell npm


【解决方案1】:

部分原因是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')"

【讨论】:

  • 有趣的是因为它的json,谢谢你的解释
猜你喜欢
  • 2018-10-12
  • 1970-01-01
  • 2019-11-26
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多