shell 重定向命令中的“200”是什么?文件描述符?

What is the "200" in this shell redirection command? File descriptor?

这个命令中的“200”是什么?我假设它是一个文件描述符,但为什么是 200?这在所有情况下都是安全的选择吗?

(
flock -s 200

# ... commands executed under lock ...

) 200>/var/lock/mylockfile

我从 flock man page.

复制了这个

这是我的编码方式。在这里,我只锁定对一个命令的访问,sleep 1。我喜欢上面的版本,因为它支持锁定一批命令。但是我想在使用它之前了解它。

flock -x /var/lock/mylockfile sleep 1

是的,200是上述语法中的一个文件描述符。当用户选择要重定向的 FD 时,shell“绕过”该选择:如果 200 先前 被 shell-internal 使用,shell 然后复制到不同的号码,尊重用户的选择。因此,您唯一需要担心的冲突是与其他 user-provided 代码和工具(当然还有标准 FD -- 0/1/2)的冲突。

POSIX 规范不保证 200 将是合法数字 -- POSIX-y shells 中规定的可寻址 FD 数量很多, 低很多 -- 但在现代系统上这不会成为问题。

使用 bash 4.1 及更高版本,您可以让 shell 本身选择一个可用的 FD。

(
   exec {lock_fd}>/var/lock/mylockfile
   flock -x "$lock_fd"
   # commands to do with the lock held
)