Pipe
將管道彎曲回其原點
有人可能認為
echo foo >a cat a | rev >a
將離開
a
包含oof
;但它是空的。
- 為什麼?
- 否則將如何適用
rev
於a
?
有一個應用程序!來自的
sponge
命令moreutils
正是為此而設計的。如果您正在執行 Linux,它可能已經安裝,如果沒有,請在作業系統的儲存庫中搜尋sponge
或moreutils
. 然後,你可以這樣做: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 重定向不同,海綿在寫入輸出文件之前會吸收其所有輸入。這允許建構讀取和寫入同一文件的管道。