在系统调用 open()
中,如果我用 O_CREAT | 打开O_EXCL
,系统调用保证文件不存在时才会创建。原子性由系统调用保证。是否有类似的方法从 bash 脚本以原子方式创建文件?
更新: 我发现了两种不同的原子方式
- 使用 set -o noclobber。然后您可以原子地使用 > 运算符。
- 只需使用 mkdir。 Mkdir 是原子的
最佳答案
100% 纯 bash 解决方案:
set -o noclobber
{ > file ; } &> /dev/null
如果不存在名为 file
的文件,此命令将创建一个名为 file
的文件。如果有一个名为 file
的文件,则什么都不做(但返回一个非零返回码)。
关于 touch
命令的优点:
- 如果文件已经存在则不更新时间戳
- 100% bash 内置
- 按预期返回代码:如果
file
已经存在或无法创建file
则失败;如果file
不存在但已创建则成功。
缺点:
- 需要设置
noclobber
选项(但在脚本中没问题,如果您小心重定向,或者之后取消设置)。
我想这个解决方案实际上是使用 O_CREAT | 的
.open
系统调用的 bash 对应物 | O_EXCL
关于c - 如果 bash 脚本不存在,则原子创建文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13828544/