Ви можете використовувати наступний трюк для заміни 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(через -кінець).
Це ефективно команда swap, яку ви бачите в алгоритмах сортування:
temp = value1;
value1 = value2;
value2 = temp;
rc, що є ще однією оболонкою. Наприклад:proc1 |[2] proc2. Хіба це не приємно? Не вbashтому.