|
1
3
在bash中不能保证(输出是以其大小为前缀的整个文件,或者-1),因为正如您所提到的,两个命令(和进程)之间可能会发生某些事情。 顺便说一句,该文件可能会被其他进程(正在执行)截断 ftruncate(2) ...), 因此,你不能保证获得内容的“整体性”。 您可以考虑使用 顾问的 locking (例如 flock(2) 或 lockf(3) ...; 同时考虑 flock(1) 在shell脚本中),只有当所有更改该文件的程序都同意该锁定时,它才能正常工作(因此需要采用整个系统) 习俗 ). 也许你想用一些 RDBMS 服务器提供 ACID -质量保证。
没有。如果你有一些进程正在运行
也许您可以编写一个简单的C程序(在 相同的 与打开文件的shell脚本中的几个命令不同,process使用 fstat(2) (可能通过 fileno(3) 如果在打开的文件描述符上使用stdio函数),并循环复制其内容。这并不能保护你免受敌视 ftruncate(2) 在复制期间由其他进程完成。
如果你不在乎截断或覆盖,只在乎过早
如果您害怕不同的文件系统,那么您可以这样做
而不是
还要注意 inotify(7) (对于你的情况来说,这可能是一种过度的做法)
更好的是,改变方式
或使用
chepner
子shell技巧和在该子shell中
|
|
|
2
2
解决方案是不检查文件是否存在;只要试着打开它,并处理打开文件时的任何错误。如果可行,这在子shell中最容易实现:
如果你真的需要
|