2014-06-10 25 views
3

我需要使用不支持它的程序prog修改文件in-placeBash:緩存整個stdin,然後輸出

prog $file > $file.temp 
cat $file.temp > $file 
rm $file.temp 

我想在沒有臨時文件的情況下在一個步驟中完成此操作。這看起來不錯,但將無法正常工作:

cat <(prog $1) > $1 

工作,如果我有一個緩衝管的內容(阻塞,直到寫結束閉合)的方式,例如:

cat <(prog $1 | buffer_until_close) > $1 

我該如何做到這一點,或者以其他方式實現所需的語法?

+4

[Sponge](http://linux.die.net/man/1/sponge) – iruvar

+0

Sponge應該在[moreutils nowadays](https://github.com/madx/moreutils/blob/master/debian/control) – Hastur

+0

爲什麼厭惡臨時文件?真的沒有編輯文件這樣的東西;似乎這樣做的程序只是隱藏創建臨時文件的細節並用它替換原始文件。 – chepner

回答

4

,如果我有一個緩衝管(阻塞,直到寫結束閉合)的內容的一種方式它的工作,如:

cat <(prog $1 | buffer_until_close) > $1

不,不會。執行stdout>$1)的重定向之前任何程序啓動。只要shell設置重定向,它會截斷輸出文件。

然而,正如在評論中提到的,sponge將工作:

prog $1 | sponge $1 

spongemoreutils包被發現,大多數Linux發行版將預裝它。

+0

謝謝!不僅我在找什麼,而且是一個有價值的課程+1 – slezica