加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

unix – awk无法重新创建它删除的文件?

发布时间:2020-12-15 21:07:41 所属栏目:安全 来源:网络整理
导读: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)删除文件,b
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中的一个错误,或者我错过了什么(很棒的时候!)?!

解决方法

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被删除,那么文件系统会注意到文件的链接数已降至零,文件将被删除.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读