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

问题描述

此命令中的“ 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会“绕行”该选择:如果以前用于shell内部使用,则shell会将其复制到另一个号码并尊重用户的选择。因此,您唯一需要担心的冲突就是与其他用户提供的代码和工具(当然还有标准FD-0/1/2)的冲突。

POSIX规范不能保证200是合法号码-POSIX-y shell中可寻址FD的强制性数量很多,很多少了-但是一个现代的系统不会有问题。

在bash 4.1及更高版本中,您可以让外壳本身选择可用的FD。

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