例如我有
样本.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
是如何工作的吗?展开。
最佳答案
{..} < file
在打开的输入流上运行一组命令。打开以从流中读取的描述符并不是每次都打开,而只是一次,即使有多个命令要运行。
这很简单,一旦你了解了 read
的数字您在特定时间调用的电话。所以基本上做 < sample.dat
重定向文件内容以在标准输入中可用或)文件描述符 0 ( STDIN_FILENO
)
只需调用 read
您请求从此输入流中读取一行行,当您这样做时就会发生
read line1 < sample.dat; read line2 < sample.dat
自 read
命令是分开的(使用 ;
),每个调用打开文件一次并仅读取可用的第一行。第一个read
打开的文件描述符一旦第一个命令完成,从标准输入流读取的命令就会关闭。第二次调用再次从起始偏移处打开标准输入流,并且不前进到第二行。
但是
{ read line1 ; read line2 ; } < sample.dat
我们打开文件一次并对 read
发出两次调用命令。第一个read
获取第一行输入。由于文件描述符尚未关闭,因此第二次调用 read
前进文件指针以寻求从文件中获取第二行输入。一旦这两个命令完成,描述符就会关闭。
关于bash - 带有 I/O 重定向的代码块 `{...}` 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51591992/