Linux

StdOut 重定向不起作用

  • April 7, 2018

department.txt 包含作為 ID 的列,我在下面使用的部門將訂單更改為部門,ID 在此處輸入圖像描述

但是如果我進一步將命令更新到下面 在此處輸入圖像描述

然後 department.txt 變為空,沒有任何輸出。如果我使用其他文件而不是我正在閱讀的同一個文件,那麼它可以工作。

我知道我正在閱讀和更新同一個文件,但根據我的理解是 | 應該照顧它,因為在內部它必須將輸出儲存在其記憶體中的某個位置並將其轉儲到我要求的文件中。不是嗎?有人可以對它的工作原理提出一些見解嗎?

注意:我知道有很多類似的問題,但沒有一個真正回答內部|工作原理,這是我需要回答的基本問題。

不,管道不會處理它。管道不會順序執行這兩個命令並將第一個命令的輸出儲存在記憶體中。這兩個程序同時執行,它們使用一種稱為管道的特殊 I/O 設備連接。但在啟動程序之前,shell 會設置所有 I/O 重定向,這意味著它會打開輸出文件並截斷它。

如果你有 GNU awk,你可以使用它的inplace選項來覆蓋輸入文件。

gawk -i inplace -F'\.' -v OFS=. '{print $2, $1}' department.txt

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