例如我有
sample.dat:
This is a 1st line.
This is a 2nd line.
当我键入:
$ {read $line1; read $line2} < sample.dat
我知道了
$ echo $line1
This is a 1st line.
$ echo $line2
This is a 2nd line.
所以,我只是认为上面的代码可能与以下方式相同:
$ read $line1 < sample; read $line2 < sample.dat
但事实并非如此,变量$line1
和$line2
都是“这是第一行”。
因此,任何人都可以请我解释一下具有I / O重定向的代码块是如何真正起作用的,以及语句{read $line1; read $line2} < sample.dat
是如何扩展的。
答案 0 :(得分:3)
{..} < file
在打开的输入流上运行一组命令。打开要从流中读取的描述符并不是每次都打开,即使有多个命令要运行,它也只会打开一次。
这很简单,一旦您了解了在给定时间进行的read
次呼叫。因此,基本上< sample.dat
会重定向文件的内容,以使其在标准输入中可用,或者)文件描述符0(STDIN_FILENO
)
通过一次调用read
,您请求从该输入流中读取一行行,当您这样做时会发生
read line1 < sample.dat; read line2 < sample.dat
由于read
命令是分开的(使用;
),因此每个调用都会打开文件一次,并且仅在第一行读取 。一旦第一个命令完成,由第一个read
命令打开以从标准输入流读取的文件描述符将关闭。第二个调用再次从起始偏移处打开标准输入流,并且 not 不会前进到第二行。
但使用
{ read line1 ; read line2 ; } < sample.dat
我们打开文件一次,并向read
命令发出两次调用。第一个read
获取输入的第一行。由于文件描述符尚未 关闭,因此对read
的第二次调用使文件指针前进,以寻求从文件中获取第二行输入。这两个命令完成后,现在将关闭描述符。