Вы можете использовать следующий трюк для swap stdout
и stderr
. Тогда вы просто используете обычную функцию конвейера.
( proc1 3>&1 1>&2- 2>&3- ) | proc2
Если stdout
и stderr
оба указывают на одно и то же место в начале, это даст вам то, что вам нужно.
Бит x>y
изменяет дескриптор файла x
, поэтому теперь он отправляет информацию туда, куда указывает дескриптор файла y
. Для нашего конкретного случая:
3>&1
создает новый маркер 3
, который будет выводить на текущий маркер 1
(исходный стандартный вывод), просто чтобы сохранить его где-то для конечной точки маркера ниже.
1>&2
изменяет дескриптор 1
(стандартный вывод) для вывода на текущий дескриптор 2
(оригинальный stderr).
2>&3-
изменяет дескриптор 2
(stderr) для вывода на текущий дескриптор 3
(оригинальный stdout), затем закрывает дескриптор 3
(через -
в конце).
Это фактически команда подкачки, которую вы видите в алгоритмах сортировки:
temp = value1;
value1 = value2;
value2 = temp;