while read -u3 i && read -u4 j;do echo $i $j done 3<afile 4<bfile
read -u3 i 的意思是从 3 号 fd (file descriptor,文件描述符) 中读一行数据到 i 变量中, 同理你明白 read -u4 j 的意思 而 3<afile 的意思是重定向 afile 到 3 号 fd 中, 同理你明白 4<bfile 所以,整个代码 while read -u3 i && read -u4 j;do echo $i $j done 3<afile 4<bfile 的意思是,不断从 afile 和 bfile 中分别读取内容到i , j 中,然后用 echo 打印出来。 这个循环会一直执行直到遇到 afile 或 bfile 中至少任意一个的文件尾。 比方说你 afile 的内容是 a b c bfile 的内容是 1 2 3 4 则这段程序就会打印 a 1 b 2 c 3
追问
为什么可以写成这样3<afile ,而不是exec 3<afile,而且不写在循环的前面呢?
回答
用现在的写法,相当于只对 while 语句进行重定向,while结束后,3,4 就没有了。 如果在 while 前面用 exec 3<afile 4<bfile 了话,从 exec 之后直到脚本结束,重定向的3,4都一直存在。 所以对于你的代码来说,既然只在 while 中需要用 afile bfile,那现在的写法就是最好的。 如果想在 while 后继续访问,那么可以考虑用 exec 3<afile 的方式。
本文转自 freeterman 51CTO博客,原文链接:http://blog.51cto.com/myunix/1619253,如需转载请自行联系原作者