bash - 带有 I/O 重定向的代码块 `{...}` 是如何工作的?

标签 bash shell io-redirection

例如我有

样本.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/

相关文章:

python - shell = False 时子进程如何使用命令

git - 尝试重定向 'git gc' 输出

bash - bash 中 `<(...)` 'operator' 的名称是什么?

linux - 检查函数(bash)中的字符串是否只有数字、小写字母和 "_"

Bash:在系统上放置可配置负载的简单方法?

Mysql cli 不在 crontab 运行的 bash 脚本中返回数据

c++ - std::cin 可以在运行时从接受文件输入切换到键盘输入吗?

Bash:在字符串中执行复杂命令,捕获输出并返回代码

java - 如何从 Java 调用 Linux shell 命令

linux - 返回主菜单后 Bash 脚本不执行更多命令