在系统调用中open(),如果我打开O_CREAT | O_EXCL,系统调用将确保仅在文件不存在时才创建该文件.系统调用保证了原子性.是否有类似的方法从bash脚本以原子方式创建文件?
更新:我发现了两种不同的原子方式
gni*_*urf 22
100%纯粹的bash解决方案:
set -o noclobber
{ > file ; } &> /dev/null
Run Code Online (Sandbox Code Playgroud)
file如果没有名为的现有文件,此命令将创建一个名为的文件file.如果有一个名为的文件file,则不执行任何操作(但返回非零返回码).
优点与touch命令:
file已存在或file无法创建则失败; 成功,如果file不存在,并创建.缺点:
noclobber选项(但是如果你小心重定向,或者之后取消设置,那么它在脚本中是可以的).我想这个解决方案实际上是open系统调用的bash对应物O_CREAT | O_EXCL.
这是一个使用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)