“<&3”和“done < file11 3< file22”是什么意思

Gau*_*rav 16 shell io-redirection read

我有以下脚本:

while read lineA && read lineB <&3
do
    echo "$lineA"
    echo "$lineB"
    echo
done < file11 3< file22
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常。但我不明白这些:

  • <&3
  • done < file11 3< file22

Kus*_*nda 22

该脚本从两个文件中读取字符串对。在每次迭代中,它从file11intolineA和 from file22into读取一个字符串lineB。它会这样做,直到遇到任一文件的结尾。循环体输出两个字符串和一个空行。

<file11手段“连接/从重定向标准输入file11,其中“此命令”是到这个命令”while循环。这也可以写0<file11

标准输入是文件描述符编号 0。文件描述符 1 和 2 保留用于标准输出和标准错误流。

3<file22意思是“连接文件描述符3到file22该命令”。数字 3 恰好是下一个“空闲”文件描述符编号,但代码可以使用 4 或 5 或除 0、1 和 2 以外的任何小整数(可用文件描述符编号的限制取决于 shell 是什么)正在使用,但保证最多 9 的数字有效)。

在循环中,read lineA默认会从标准输入中读取一个字符串,即从文件中读取file11(标准输入是从循环中继承的)。这也可以写read lineA <&0

使用read lineB <&3read命令从文件描述符 3 读取,即从file22,而不是从标准输入(文件描述符 3 在循环中可用,就像标准输入一样)。

简而言之,它使用标准输入流和“额外”文件描述符(编号 3)“同时”从两个文件(依次从每个文件中读取一个字符串)读取。通常,一个人只能访问一个输入流,但这通过显式创建第二个输入流并将其连接到file22文件来绕过该限制。

有关的:


我在上面使用“字符串”而不是“线”这个词。从这两个文件中读取的内容将被剥离,并且某些转义序列将被特别解释。

要使用阅读一行read,请使用

IFS= read -r varname
Run Code Online (Sandbox Code Playgroud)

有关的:

  • @A.Donda 你在描述 `fdopen()`。是的。 (2认同)