c - 如果 bash 脚本不存在,则原子创建文件

标签 c linux bash

在系统调用 open() 中,如果我用 O_CREAT | 打开O_EXCL,系统调用保证文件不存在时才会创建。原子性由系统调用保证。是否有类似的方法从 bash 脚本以原子方式创建文件?

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

  1. 使用 set -o noclobber。然后您可以原子地使用 > 运算符。
  2. 只需使用 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/

相关文章:

c - 为子类添加额外的 "methods"

linux - GCC 本地安装 Ubuntu

c++ - USB 通讯接口(interface)

c++ - 如何在线程创建和退出时调用函数?

bash - basename 命令未按预期工作

regex - Grep 并仅打印字符串的开头和结尾

linux - 通过 cURL 远程执行 Bash 脚本

c - 在 c 中使用逗号运算符

C - 双指针通过函数调用丢失

c - 使用 ARM 内联汇编在没有 libc 的情况下进行系统调用