bash中exec {lock_fd}语法的含义是什么?
{lock_fd} 语法解释
你看到的{lock_fd}>是Bash 4.1及更高版本提供的自动分配文件描述符语法,作用和你猜测的基本一致:
- 当你在重定向符号(
>、<、>>等)左侧使用{变量名}格式的写法时,Bash会自动检索当前未被占用的文件描述符(数值默认大于等于10),将目标文件绑定到这个描述符上,同时把描述符的数值赋值给你指定的变量。 - 你测试时两次执行
exec {lock_fd}>test.lock分别得到18、19的结果完全符合规则:第一次执行时18是空闲的,就将18赋值给lock_fd;第二次执行时18已经被占用,Bash就自动找下一个空闲的19完成分配。
该语法的核心优势
传统Shell脚本需要手动指定文件描述符的数值,很容易和标准输入(0)、标准输出(1)、标准错误(2),或是脚本其他位置已经使用的描述符冲突。使用自动分配语法不需要开发者手动管理描述符编号,Bash会自动处理分配逻辑,完全规避冲突问题。
你提供的flock代码逻辑拆解
# 自动分配空闲文件描述符,以写入模式打开锁文件,描述符数值存入lock_fd变量,打开失败直接退出 exec {lock_fd}>/var/lock/mylockfile || exit 1 # 对该描述符加非阻塞排他锁,加锁失败则打印错误信息并退出 flock -n "$lock_fd" || { echo "ERROR: flock() failed." >&2; exit 1; } # 此处编写需要加锁保护的业务命令,避免并发执行产生冲突 # 业务执行完成后手动解锁,脚本退出时该描述符也会自动关闭,锁随之自动释放 flock -u "$lock_fd"
如果你不需要继续使用这个文件描述符,可以手动执行exec {lock_fd}>&-关闭它,对应的描述符数值会被释放,后续分配时可以被复用。
内容的提问来源于stack exchange,提问作者John Winston
相关产品推荐
相关产品推荐

