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”结束,对吗?
它不起作用。我试过系统(“/ usr / bin / rm -f”fname)删除文件,bash而不是ksh,Linux,HP-UX,Cygwin,fflush(“”),...只是不起作用! 在删除文件后,Awk似乎无法再写入同名文件。
看起来像是Awk中的一个错误,或者我错过了什么(很棒的时候!)?!
答案 0 :(得分: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.txt
和foo.txt
都是指向同一文件的链接。 awk
打开该文件并向其写入一行,然后删除链接foo.txt
,然后将另一行写入该文件。当awk
终止时,链接foo.txt
已被删除,但该文件仍然存在,可通过链接bar.txt
访问。如果删除bar.txt
,则文件系统会注意到文件的链接数已降至零,文件将被删除。