Pipe

將管道彎曲回其原點

  • May 14, 2020

有人可能認為

echo foo >a
cat a | rev >a

將離開a包含oof;但它是空的。

  1. 為什麼?
  2. 否則將如何適用reva

有一個應用程序!來自的sponge命令moreutils正是為此而設計的。如果您正在執行 Linux,它可能已經安裝,如果沒有,請在作業系統的儲存庫中搜尋spongemoreutils. 然後,你可以這樣做:

echo foo >a
cat a | rev | sponge a

或者,避免UUoC

rev a | sponge a

這種行為的原因在於您的命令的執行順序。這> a實際上是執行的第一件事並> file清空文件。例如:

$ echo "foo" > file
$ cat file
foo
$ > file
$ cat file
$

所以,當你執行時cat a | rev >a,實際發生的> a是首先執行,清空文件,所以當cat a你執行時,文件已經是空的。這正是sponge寫成的原因(來自man sponge,強調我的):

海綿讀取標準輸入並將其寫入指定文件。 與 shell 重定向不同,海綿在寫入輸出文件之前會吸收其所有輸入。這允許建構讀取和寫入同一文件的管道。

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