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