posix 标准覆盖重定向会导致意外输出

posix 标准覆盖重定向会导致意外输出

我一直在尝试构建一个小型 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由于重定向,该文件为空。这就是该文件中的原始数据在输出中不可见的原因。

相关内容