2010-12-15 24 views
1
TMP="$$.FILE" 

#Process puts contents into TMP 

cat "$TMP" | sort | head > "$TMP" 

我已經確定該文件不是空的開始。如果沒有> "$TMP",它會輸出一些內容,但是當它再次存儲到同一個文件中時,它是空的。可能是什麼原因?爲什麼這會導致文件變空?

回答

2

這些進程都是並行運行的,所以在cat有機會讀取之前,head命令會截斷文件。

要獲得您想要的結果,您需要將排序輸出寫入不同的文件,然後將其移至原始文件。

cat "$TMP" | sort | head > "$TMP".new 
mv "$TMP".new "$TMP" 
+0

+1 - 謝謝你 – Strawberry 2010-12-15 17:02:01

+0

'排序 「$ TMP」 |頭> 「$ TMP」。新&& MV 「$ TMP」。新的 「$ TMP」'將繼續從重挫的文件!如果出現錯誤(並且它給貓貓一個休息) – 2010-12-15 20:16:38

3

您無法同時寫入和讀取文件。這裏大概會發生什麼:

  1. > "$TMP"導致文件被打開寫入,這也會截斷文件。
  2. cat "$TMP"從現在讀取空白文件。
  3. 文件保持空白。

聲稱修改文件的命令實際上在封面下執行一些臨時文件洗牌。例如,sed -i將處理輸入文件並將結果保存到input.tmp,然後在mv input.tmp input末尾覆蓋原始文件。你應該遵循這個模型。

+0

我明白了,那麼圍繞它的解決方案是什麼?創建另一個TMP文件? – Strawberry 2010-12-15 17:01:10

1

在發生任何事情之前,最後一個管道將會截斷第一個管道讀取的文件。那麼cat會發生什麼情況會嘗試讀取立即截斷的電話號碼爲head的文件。這是造成這裏的問題;該>運營商是一個shell運營商,這意味着「截斷這個文件的時候了,然後讓進程寫它的標準輸出到文件中。

在一個相關的說明,您不需要cat這裏。

嘗試這個代替:

TMP="$$.FILE"  
sort <"$TMP" | head > "$TMP.tmp" 
mv "$TMP.tmp" "$TMP" 
相關問題