“ <&3”和“ done <file11 3 <file22”的含义是什么


16

我有以下脚本:

while read lineA && read lineB <&3
do
    echo "$lineA"
    echo "$lineB"
    echo
done < file11 3< file22

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

  • <&3
  • done < file11 3< file22

1
您能解释一下脚本是什么吗?(您说它工作正常)
Mathieu

Answers:


22

该脚本从两个文件读取成对的字符串。在每次迭代中读取一个字符串从file11进入lineA,并从file22lineB。直到遇到两个文件的末尾为止。循环的主体输出两个字符串和一个空行。

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

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

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

在循环中,read lineA默认情况下将从标准输入(即从文件)读取字符串file11(标准输入是从循环继承的)。这本来可以写的read lineA <&0

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

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

有关:


我在上方使用“字符串”一词,而不是“行”。从这两个文件读取的内容将剥去侧翼的空格,并且某些转义序列将被特别解释。

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

IFS= read -r varname

有关:


好答案!我不明白的是如何使用文件描述符3。这是否意味着比3<file22就像是fopenFID没有返回,但预先指定?
A. Donda

2
@ A.Donda您正在描述fdopen()。是。
库萨兰达
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.