2012-06-05 88 views
4
echo bla | awk 'BEGIN{fname="foo.txt"} {print $0 >>fname; print "rm -f " fname | "/usr/bin/ksh"; close("/usr/bin/ksh"); print $0 >>fname}' 

執行此命令後,我應該最終生成一個文件「foo.txt」,對不對?awk無法重新創建它刪除的文件?

它不起作用。我嘗試使用system(「/ usr/bin/rm -f」fname)刪除文件,而不是使用ksh,Linux,HP-UX,Cygwin,fflush(「」),bash而無法使用! 看來在文件被刪除後,Awk就無法再寫入同名的文件了。

看起來像Awk中的錯誤,或者我錯過了什麼(大時間!)?!

回答

5

awk保持文件打開。嘗試關閉它:

echo bla | awk 'BEGIN{fname="foo.txt"} 
{ 
    print $0 >>fname 
    print "rm -f " fname | "/usr/bin/ksh" 
    close("/usr/bin/ksh") 
    close(fname) 
    print $0 >>fname 
}' 

awk在您第一次寫入文件時打開文件,並保持該文件處於打開狀態。當鏈接從文件系統中刪除時,awk仍然打開文件,因此它不使用「foo.txt」名稱來訪問它。通過關閉文件,您可以強制awk再次查看文件系統,並創建現在不存在的鏈接「foo.txt」。

對於讀者誰不明白的鏈接和文件之間的區別的利益,請嘗試以下操作:

$ rm -rf /tmp/foo; mkdir /tmp/foo; cd /tmp/foo # start with a clean directory 
$ touch foo.txt; ln foo.txt bar.txt    # Create a file with two links 
$ # run original awk script (without closing the file) 
$ cat bar.txt 

你會看到一行「喇嘛」兩次跳回到bar.txt。原因是bar.txtfoo.txt都鏈接到同一個文件。 awk打開該文件並向其寫入一行,然後刪除鏈接foo.txt,然後將另一行寫入該文件。當awk終止時,鏈接foo.txt已被刪除,但該文件仍然存在,並可通過鏈接bar.txt訪問。如果bar.txt被刪除,那麼文件系統會注意到該文件的鏈接數已經降爲零,並且該文件將被刪除。

+0

對我感到羞恥。你是絕對正確的。非常感謝。 – ExpertNoob

相關問題