Логика
Конвейер обеспечивает асинхронное выполнение команд с использованием буферизации ввода/вывода. Таким образом все команды в конвейере работают параллельно, каждая в своем процессе.
Несмотря на то, что конвейер оперирует файловыми дескрипторами потоков ввода/вывода, все операции выполняются в памяти, без нагрузки на диск.
В 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, которая инструктирует оболочку выполнить последнюю команду на переднем плане текущей среды.