exec 和 flock 如何在 bash 脚本中协同工作

How do exec and flock work together in bash script

Bash 脚本:

#!/bin/bash
...
exec {LOCK} > foo.out
flock -x ${LOCK}
...

我知道不带参数的 exec 只是将当前 shell 的所有输出重定向到 foo.out 文件。问题:

  1. exec {LOCK} 的第一个参数是什么意思,鉴于它似乎具有特殊意义,因为它在花括号中(但不是 ${...})。

  2. ${LOCK}的值是多少,它是从哪里来的(我不认为我定义了这个变量)?

这是我终于弄明白的:

exec {LOCK}> foo.out 将当前 shell 的标准输出更改为文件 foo.out。打开文件的 fd 设置变量 ${LOCK}。将 fd 设置为 {LOCK} 变量是 bash.

的一个特性

flock -x ${LOCK} 只是使用文件描述符进行锁定。

这无效或无用 bash。它只会导致两条不同的错误消息。

相反,预期的代码是这样的:

#!/bin/bash
...
exec {LOCK}> foo.out
flock -x ${LOCK}
...

它使用:

  1. {name}> 以写入方式打开并将f​​d号分配给name
  2. exec 将重定向应用于当前,在 shell
  3. 期间保持 fd 打开
  4. flock 锁定分配的 fd,它将继承当前 shell

如此有效,它基于文件 foo.out 创建了一个互斥体,确保一次只允许一个实例处理 flock 之后的 运行 事物。任何其他实例将等到前一个实例完成。