TMP="$$.FILE"
#Process puts contents into TMP
cat "$TMP" | sort | head > "$TMP"
我已經確定該文件不是空的開始。如果沒有> "$TMP"
,它會輸出一些內容,但是當它再次存儲到同一個文件中時,它是空的。可能是什麼原因?爲什麼這會導致文件變空?
TMP="$$.FILE"
#Process puts contents into TMP
cat "$TMP" | sort | head > "$TMP"
我已經確定該文件不是空的開始。如果沒有> "$TMP"
,它會輸出一些內容,但是當它再次存儲到同一個文件中時,它是空的。可能是什麼原因?爲什麼這會導致文件變空?
這些進程都是並行運行的,所以在cat有機會讀取之前,head命令會截斷文件。
要獲得您想要的結果,您需要將排序輸出寫入不同的文件,然後將其移至原始文件。
cat "$TMP" | sort | head > "$TMP".new
mv "$TMP".new "$TMP"
您無法同時寫入和讀取文件。這裏大概會發生什麼:
> "$TMP"
導致文件被打開寫入,這也會截斷文件。cat "$TMP"
從現在讀取空白文件。聲稱修改文件的命令實際上在封面下執行一些臨時文件洗牌。例如,sed -i
將處理輸入文件並將結果保存到input.tmp
,然後在mv input.tmp input
末尾覆蓋原始文件。你應該遵循這個模型。
我明白了,那麼圍繞它的解決方案是什麼?創建另一個TMP文件? – Strawberry 2010-12-15 17:01:10
在發生任何事情之前,最後一個管道將會截斷第一個管道讀取的文件。那麼cat
會發生什麼情況會嘗試讀取立即截斷的電話號碼爲head
的文件。這是造成這裏的問題;該>
運營商是一個shell運營商,這意味着「截斷這個文件的時候了,然後讓進程寫它的標準輸出到文件中。
在一個相關的說明,您不需要cat
這裏。
嘗試這個代替:
TMP="$$.FILE"
sort <"$TMP" | head > "$TMP.tmp"
mv "$TMP.tmp" "$TMP"
+1 - 謝謝你 – Strawberry 2010-12-15 17:02:01
'排序 「$ TMP」 |頭> 「$ TMP」。新&& MV 「$ TMP」。新的 「$ TMP」'將繼續從重挫的文件!如果出現錯誤(並且它給貓貓一個休息) – 2010-12-15 20:16:38