我一直在尝试构建一个小型 bash 脚本来覆盖 Node.js 中的某些配置。我正在使用 zsh,因此如果您重定向现有文件中的输出,则会出现警告(看这里)。我一直在尝试建议的答案,尽管输出很不寻常。我想知道也许我在这里做错了什么。
echo 'module.exports = { "foo": 1 }' > foo.js
node -e '
const foo = require("./foo")
foo.bar = 1
console.log(`module.exports = ${JSON.stringify(foo)}`)
'
# output is: module.exports = {"foo":1,"bar":1}
node -e '
const foo = require("./foo")
foo.bar = 1
console.log(`module.exports = ${JSON.stringify(foo)}`)
' > bar.js
cat bar.js
# output is: module.exports = {"foo":1,"bar":1}
node -e '
const foo = require("./foo")
foo.bar = 1
console.log(`module.exports = ${JSON.stringify(foo)}`)
' >| foo.js
# output is: module.exports = {"bar":1}
我的印象是,它>|
会绕过 zsh 的“覆盖文件”警告,但它确实计算出“与预期不同”的返回值。
实际:module.exports = {"bar":1}
预期:module.exports = {"foo":1,"bar":1}
的字节到哪里去了"foo:1"
?有人可以向我解释一下发生了什么事吗?
答案1
当命令的输出使用>
或重定向>|
到文件时,该文件首先被截断(清空),然后命令被执行。
当您运行上一个示例中的 Node.js 代码时,foo.js
由于重定向,该文件为空。这就是该文件中的原始数据在输出中不可见的原因。