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

Jim*_*imm 11 c linux bash

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

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

  1. 使用set -o noclobber.然后你可以原子地使用> operator.
  2. 只需使用mkdir.Mkdir是原子的

gni*_*urf 22

100%纯粹的bash解决方案:

set -o noclobber
{ > file ; } &> /dev/null
Run Code Online (Sandbox Code Playgroud)

file如果没有名为的现有文件,此命令将创建一个名为的文件file.如果有一个名为的文件file,则不执行任何操作(但返回非零返回码).

优点与touch命令:

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

缺点:

  • 需要设置noclobber选项(但是如果你小心重定向,或者之后取消设置,那么它在脚本中是可以的).

我想这个解决方案实际上是open系统调用的bash对应物O_CREAT | O_EXCL.

  • `(设置-o noclobber;>文件)&>/dev/null`执行相同操作,但不影响当前shell中的`noclobber`选项. (6认同)
  • "> file"保证是原子的吗? (2认同)

the*_*lfe 5

这是一个使用mv -n诀窍的bash函数:

function mkatomic() {
  f="$(mktemp)"
  mv -n "$f" "$1"
  if [ -e "$f" ]; then
    rm "$f"
    echo "ERROR: file exists:" "$1" >&2
    return 1
  fi
}
Run Code Online (Sandbox Code Playgroud)

例子:

$ mkatomic foo
$ wc -c foo
0 foo
$ mkatomic foo
ERROR: file exists: foo
Run Code Online (Sandbox Code Playgroud)