Shell

來自 moreutils 的海綿 - 外殼重定向有什麼區別?有用的例子?

  • June 7, 2015
> brew install moreutils                                                          
==> Downloading https://homebrew.bintray.com/bottles/moreutils-0.55.yosemite.bottle.tar.gz    
######################################################################## 100.0%               
==> Pouring moreutils0.55.yosemite.bottle.tar.gz       
🍺  /usr/local/Cellar/moreutils/0.55: 67 files, 740K   

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

我不明白。請給我一些有用的例子。

浸泡是什麼意思?

假設您有一個名為 的文件input,您想刪除所有以 in 開頭的#input。您可以讓所有行不以#使用開頭:

grep -v '^#' input

但是你如何改變input?使用標準 POSIX 工具箱,您需要使用一個臨時文件,例如:

grep -v '^#' input >/tmp/input.tmp
mv /tmp/input.tmp ./input

使用外殼重定向:

grep -v '^#' input >input

input在您閱讀之前會被截斷。

使用sponge,您可以:

grep -v '^#' input | sponge input

moreutils首頁本身記錄了一個典型的案例:

sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd

在這裡,/etc/passwd 正在被寫入和讀取,並且正在被修改。如果在寫入之前不使用標準輸入,/etc/passwd 可能會損壞(因為文件在讀取期間發生了更改)。

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