一尘不染

bash脚本中不存在的原子创建文件

linux

在系统调用中open(),如果使用打开O_CREAT | O_EXCL,系统调用将确保仅在文件不存在时才创建该文件。系统调用保证原子性。有没有类似的方法可以通过bash脚本以原子方式创建文件?

更新:我发现了两种不同的原子方式

  1. 使用set -o noclobber。然后,您可以原子地使用>运算符。
  2. 只需使用mkdir。Mkdir是原子的

阅读 417

收藏
2020-06-07

共1个答案

一尘不染

100%纯bash解决方案:

set -o noclobber
{ > file ; } &> /dev/null

file如果不存在名为的文件,则此命令将创建一个名为的文件file。如果有一个名为的文件file,则什么也不做(但返回一个非零的返回码)。

优点touch

  • 如果文件已经存在,则不更新时间戳
  • 内置100%bash
  • 按预期返回代码:如果file已经存在或file无法创建,则失败;成功,如果file不存在并被创建。

缺点:

  • 需要设置该noclobber选项(但是如果您对重定向很小心,或者在之后取消设置,那么在脚本中就可以了)。

我猜这种解决方案确实是使用进行open系统调用的bash对应方式O_CREAT | O_EXCL

2020-06-07