【问题标题】:Awk can't re-create a file it deleted?awk 不能重新创建它删除的文件?
【发布时间】:2012-06-05 21:08:17
【问题描述】:
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”,对吧?

它不起作用。我尝试使用 system("/usr/bin/rm -f " fname) 删除文件,bash 而不是 ksh,Linux,HP-UX,Cygwin,fflush(""),... 只是不起作用! 似乎删除文件后,Awk 就无法再写入同名文件了。

看起来像 Awk 中的一个错误,或者我错过了什么(大时代!)?!

【问题讨论】:

    标签: unix awk


    【解决方案1】:

    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 中看到两次“bla”行。原因是bar.txtfoo.txt 都是指向同一个文件的链接。 awk 打开该文件并向其中写入一行,然后删除链接foo.txt,然后将另一行写入文件。当awk 终止时,链接foo.txt 已被删除,但文件仍然存在并可通过链接bar.txt 访问。如果bar.txt 被删除,那么文件系统会注意到该文件的链接计数已降至零并且该文件将被删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      相关资源
      最近更新 更多