bash
имеет целый набор составных команд, которые работают так же, как простые команды. Наиболее уместным здесь является то, что каждая составная команда имеет свой собственный стандартный ввод и стандартный вывод.
{ ... }
- это одна из таких составных команд. Каждая команда внутри группы наследует свой стандартный ввод и вывод от группы, поэтому в результате стандартный вывод группы является объединением стандартного вывода ее дочерних элементов. Кроме того, каждая команда внутри по очереди читает со стандартного ввода группы. В вашем примере ничего интересного не происходит, потому что grep
использует весь стандартный ввод, и никакая другая команда не пытается прочитать его. Но рассмотрим этот пример:
$ cat tmp.txt
foo
bar
$ { read a; read b; echo "$b then $a"; } < tmp.txt
bar then foo
Первый read
получает одну строку из стандартного ввода, а второй read
получает вторую. Важно отметить, что первый read
потребляет строку ввода, прежде чем второй read
сможет ее увидеть. Сравните это с
$ read a < tmp.txt
$ read b < tmp.txt
, где a
и b
будут содержать foo
, потому что каждая команда read
открывает tmp.txt
заново, и обе читают первую строку.