具有I / O重定向的代码块“ {...}”如何工作?

时间:2018-07-30 10:31:59

标签: bash shell io-redirection

例如我有

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是如何扩展的。

1 个答案:

答案 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的第二次调用使文件指针前进,以寻求从文件中获取第二行输入。这两个命令完成后,现在将关闭描述符。