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