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
该脚本从两个文件中读取字符串对。在每次迭代中,它从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
Run Code Online (Sandbox Code Playgroud)
有关的: