为什么要使用<&;3",&引用;三,-&引用;及;3</文件";在bash-while循环中?它实际上是做什么的?

为什么要使用<&;3",&引用;三,-&引用;及;3</文件";在bash-while循环中?它实际上是做什么的?,bash,while-loop,file-descriptor,io-redirection,Bash,While Loop,File Descriptor,Io Redirection,我正在浏览一个bash脚本,试图找出它是如何工作的,并可能对其进行修补。所讨论的脚本是debian提供的cryptroot脚本,该脚本负责在启动时解密块设备。在bash中不完全在家肯定是一个挑战 我找到了这段代码,但我不确定它的作用 if [ -r /conf/conf.d/cryptroot ]; then while read mapping <&3; do setup_mapping "$mapping" 3<&- done 3&

我正在浏览一个bash脚本,试图找出它是如何工作的,并可能对其进行修补。所讨论的脚本是debian提供的
cryptroot
脚本,该脚本负责在启动时解密块设备。在bash中不完全在家肯定是一个挑战

我找到了这段代码,但我不确定它的作用

if [ -r /conf/conf.d/cryptroot ]; then
    while read mapping <&3; do
        setup_mapping "$mapping" 3<&-
    done 3< /conf/conf.d/cryptroot
fi
其中,
文件
的输出指向while循环中的
读取
,并执行
命令
,直到最后一行

我对重定向也有一点了解,例如,我有时用它重定向
STDOUT
STDERR
/dev/null
之类的东西。但我不确定重定向到
3
意味着什么

在阅读了更多关于I/O重定向的内容后,我有了一个接近答案的答案

stdin、stdout和stderr的文件描述符分别为0、1和2, 分别地对于打开其他文件,仍有描述符3 到九点

因此,3“只是”对打开文件的引用,或者:

…只是操作系统分配给打开文件的一个数字 跟踪它。将其视为文件指针的简化类型。

据我所知:

  • 3
    打开
    /conf/conf.d/cryptroot
    进行读取,并将其分配给文件描述符3
  • 读取映射是

    while read LINE
        do COMMAND
    done < FILE
    
    读取行时
    指挥
    完成<文件
    
    人们忘记了命令也在从文件中读取数据,并且可能会使用while循环控制中的
    read
    读取的数据。为了避免这种情况,一个常见的习惯用法是从不同的文件描述符读取。这是通过
    Re实现的:
    setup_mapping“$mapping”3请参见(以及“Linked”侧栏中列出的许多重复项),以了解这可以避免的问题示例。
    
    while read mapping; do
        setup_mapping "$mapping"
    done < /conf/conf.d/cryptroot
    
    while read LINE
        do COMMAND
    done < FILE