posix 標準の上書きリダイレクトにより予期しない出力が発生する

posix 標準の上書きリダイレクトにより予期しない出力が発生する

私はNode.jsの特定の設定をオーバーライドするために小さなbashスクリプトを書こうとしました。私は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リダイレクトのためファイルが空になります。これが、このファイルの元のデータが出力に表示されない理由です。

関連情報