Bash

覆蓋重定向的posix標準導致意外輸出

  • June 15, 2020

我一直在嘗試建構一個小的 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"?有人可以解釋一下發生了什麼嗎?

當命令的輸出與文件一起重定向>或重定向>|到文件時,該文件首先被截斷(清空),然後執行命令。

在上一個範例中執行 Node.js 程式碼時foo.js,由於重定向,該文件為空。這就是為什麼該文件中的原始數據在輸出中不可見的原因。

引用自:https://unix.stackexchange.com/questions/592797