Логика

Конвейер обеспечивает асинхронное выполнение команд с использованием буферизации ввода/вывода. Таким образом все команды в конвейере работают параллельно, каждая в своем процессе.

Несмотря на то, что конвейер оперирует файловыми дескрипторами потоков ввода/вывода, все операции выполняются в памяти, без нагрузки на диск.

В Bash есть переменная с именем PIPESTATUS, которая содержит список состояний завершения процессов в самом последнем выполненном конвейере:

$ exit 1 | exit 2 | exit 3 | exit 4 | exit 5
$ echo ${PIPESTATUS[@]}
1 2 3 4 5

Возвращаемый статус выполнения всего конвейера будет зависеть от статуса переменной pipefail.

Если эта переменная установлена, возвращаемым статусом конвейера будет статус завершения самой правой команды с ненулевым статусом или будет равен нулю, если все команды завершатся успешно:

$ set -o pipefail
$ exit 1 | exit 2 | exit 3| exit 4 | exit 0
$ echo $?
4

При отключенной опции pipefail возвращаемым статусом канала будет статус завершения последней команды:

$ set +o pipefail
$ exit 1 | exit 2 | exit 3| exit 4 | exit 0
$ echo $?
0

В Bash также есть опция lastpipe, которая инструктирует оболочку выполнить последнюю команду на переднем плане текущей среды.