在bash中锁定对文件的访问时是否需要额外的锁定文件

在bash中锁定对文件的访问时是否需要额外的锁定文件,bash,concurrency,locking,Bash,Concurrency,Locking,我目前正在研究Bash中的锁。在我正在使用的脚本中,我有一个文件,可以由相同或其他脚本的多次调用同时使用。为了同步对文件的访问,我正在使用锁定文件: ( flock -x -w 10 200 # do stuff with the file $DATAFILE ) 200>$LOCKFILE 这是我在网上找到的一些例子。但是,我想知道是否确实需要额外的$LOCKFILE,或者我是否可以直接锁定对$DATAFILE的访问: ( flock -x -w 10 200

我目前正在研究Bash中的锁。在我正在使用的脚本中,我有一个文件,可以由相同或其他脚本的多次调用同时使用。为了同步对文件的访问,我正在使用锁定文件:

(
   flock -x -w 10 200
   # do stuff with the file $DATAFILE
) 200>$LOCKFILE
这是我在网上找到的一些例子。但是,我想知道是否确实需要额外的
$LOCKFILE
,或者我是否可以直接锁定对
$DATAFILE
的访问:

(
   flock -x -w 10 200
   # do stuff with the file $DATAFILE
) 200>>$DATAFILE

这是否可行,或者将我尝试同步访问的文件用作锁定文件是否也有问题?

您可以锁定现有的文件描述符,而不是创建新的文件描述符,并且该描述符可以与您用于数据文件的描述符相同:

exec 200<>$DATAFILE
flock -n 200 || { echo "Already locked"; exit 1; }
# do your stuff with descriptor 200
flock -u 200
# optionally, close the descriptor
exec 200>&-
exec 200$DATAFILE
flock-n 200 | |{echo“已锁定”;出口1;}
#用描述符200做你的事情
鸥群-u 200
#(可选)关闭描述符
执行200>&-
这也适用于只读描述符:

exec 200<$DATAFILE
exec 200