我有以下脚本:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
这段代码运行良好。但我不明白这些:
<&3
done < file11 3< file22
答案1
该脚本从两个文件中读取字符串对。在每次迭代中,它从file11
intolineA
和 from file22
into读取一个字符串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 <&3
,该read
命令从文件描述符 3 读取,即从file22
,而不是从标准输入读取(文件描述符 3 在循环中可用,就像标准输入一样)。
简而言之,它使用标准输入流和“额外”文件描述符(数字 3)“同时”从两个文件中读取(依次从每个文件中一次读取一个字符串)。通常,一个人只能访问一输入流,但这通过显式创建第二个输入流并将其连接到文件来绕过该限制file22
。
有关的:
我在上面使用“串”这个词而不是“线”。从两个文件中读取的内容将去除两侧的空格,并且某些转义序列将被特殊解释。
阅读一个线使用read
,使用
IFS= read -r varname
有关的: