LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4328|回复: 7

请教shell中如何覆写当前处理的文件?

[复制链接]
发表于 2010-9-29 15:06:06 | 显示全部楼层 |阅读模式
怎样将"commond file1"的处理结果覆盖当前文件file1?
发表于 2010-9-29 15:56:41 | 显示全部楼层
有些command支持直接编辑(in-place edit),比如sed -i选项。如果不支持,通常你需要:
  1. cp file1 file1.bak
  2. command <file1.bak > file1
  3. rm file1.bak
复制代码
试图这样是不行的:
  1. command <file1 > file1
复制代码
, 那样你将会抹掉一切数据。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-29 19:06:44 | 显示全部楼层
嗯,只能用临时文件了
以前在《unix编程环境》看到过overwrite命令,但是linux上没用。
回复 支持 反对

使用道具 举报

发表于 2010-9-30 11:30:10 | 显示全部楼层
Post by daxi;2113759
以前在《unix编程环境》看到过overwrite命令,但是linux上没用。

呵呵,overwrite?从没听说哪个Unix版本上自带了这个命令,估计是自己写的脚本而已,不用说得Linux像个异类一样的嘛...
回复 支持 反对

使用道具 举报

发表于 2010-10-2 19:09:29 | 显示全部楼层
Please try this:
{ rm "$file" && $your-program > "$file"; } < "$file"
回复 支持 反对

使用道具 举报

发表于 2010-10-4 21:33:48 | 显示全部楼层
Post by helloworld1;2114058
Please try this:
{ rm "$file" && $your-program > "$file"; } < "$file"
呃,新东西,不知道该在IEEE 1003.1如何找到能这么做的解释...(只能说这种做法很隐晦,很tricky啊...)
回复 支持 反对

使用道具 举报

发表于 2010-10-7 10:27:39 | 显示全部楼层
Post by helloworld1;2114058
Please try this:
{ rm "$file" && $your-program > "$file"; } < "$file"


在Bash的man page里面,“{ list; }"是一种复合命令,里面的命令列表list共享相同的标准输入/输出。
我猜这里神奇的地方应该是打开一个文件之后,删除它,然后重新创建一个同名文件。尽管在list里面首先删除了那个文件,然而由于外层

  1. { list; } < "$file"
复制代码

这个文件还是处于打开状态,内核不会删除这个文件在磁盘上的内容(直到其被关闭),新创建的文件尽管有相同的名称,但是仅此而已,它们没有引用相同的inode,这只是一个刚好有相同名称的新文件。
回复 支持 反对

使用道具 举报

发表于 2010-11-2 22:21:28 | 显示全部楼层
感觉这样不太安全。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表