Bash
覆蓋重定向的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"
?有人可以解釋一下發生了什麼嗎?
當命令的輸出與文件一起重定向
>
或重定向>|
到文件時,該文件首先被截斷(清空),然後執行命令。在上一個範例中執行 Node.js 程式碼時
foo.js
,由於重定向,該文件為空。這就是為什麼該文件中的原始數據在輸出中不可見的原因。