node.js - 使用命令扩展运行 NPM 脚本会在返回结果之前解析结果 - 与 bash 不同

标签 node.js bash shell npm

如果我在 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/

相关文章:

javascript - 如何在 node.js 中将 HTML 页面转换为纯文本?

mysql - Node.js 不等待 MySQL 服务器发送应答,继续异步工作

linux - 如何捕获终端中的第一个命令输出并使用同一行中的最后一个命令打印该变量

Bash while 循环等待任务完成

javascript - 在循环内等待 API 的结果

node.js - 使用 node.js 运行数据库迁移 (mongodb)

linux - 如何从 pid 中找到 bash 脚本名称?

linux - 如何使用 shell 脚本在多个 csv 文件的末尾添加列

linux - 如何截断 "wc -l"命令中的目录行?

linux - 只计算 linux 中的可执行文件而不是所有具有可执行权限的文件