При использовании конвейера (command1 | command2
) по умолчанию перенаправляется только стандартный вывод (stdout
), а стандартный поток ошибок (stderr
) продолжает выводиться в терминал. Вот как можно перенаправить оба потока:
command1 2>&1 | command2
Объяснение:
2>&1
перенаправляет дескриптор 2 (stderr
) в дескриптор 1 (stdout
)command1 2> error.log | command2 > output.log
Объяснение:
stderr
записывается в файл error.log
stdout
передается в command2
, а его вывод сохраняется в output.log
command1 > >(command2) 2>&1
Объяснение:
>(command2)
создает временный файловый дескриптор для command2
2>&1
объединяет потоки{ command1 2>&1 1>&3 | command2; } 3>&1
Объяснение:
stdout
stderr
перенаправляется в текущий stdout
(который ведет в конвейер)stdout
сохраняется через дескриптор 3command1 |& command2
Объяснение:
|&
это сокращение для 2>&1 |
2>&1 |
|&
Все методы работают в POSIX-совместимых оболочках, кроме специально отмеченных Bash-специфичных вариантов.