Вы можете использовать следующий трюк для обмена 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хотя.