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”,对吧?

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

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

4

1 回答 1

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

于 2012-06-05T12:48:20.083 回答