Команда Unix / Linux Kyle виконує завдання перемикання STDERR з STDOUT; проте пояснення не зовсім правильне. Оператори переадресації не роблять жодного копіювання чи копіювання, вони просто перенаправляють потік в інший бік.
Переписання команди Кайла тимчасовим переміщенням 3> і 1 до кінця полегшило б розуміння поняття:
find /var/log 1>&2 2>&3 3>&1
Написаний таким чином, Linux буде відображати помилку, оскільки & 3 ще не існує, оскільки вона розташована перед 3> & 1. 3> щось є способом оголосити (визначити), що ми будемо використовувати третю трубу, тому вона повинна бути розташована перед тим, як потрапляти воду в цю трубу, наприклад так, як написав її Кайл. Спробуйте цей інший спосіб просто для розваги:
((echo "STD1"; anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR
Прикро не мати способу робити копії. Ви не можете робити такі речі, як "3> & 1 3> & 2" в одній команді, оскільки Linux буде використовувати лише перший знайдений, а другий відхиляє.
Я ще не знайшов способу надіслати як помилку, так і звичайний вихід у файл, а також надіслати копію помилки на стандартний вихід однією командою. Для instace, у мене є робота з cron, що я хочу, щоб обидва виходи (помилка та стандарт) перейшли до файлу журналу, і помилка також вийде, щоб зробити повідомлення електронною поштою, відправлене моєму BlackBerry. Я можу це зробити двома командами за допомогою "tee", але помилка не відображається в правильному порядку серед звичайного рядка виводу у файлі. Це некрасивий спосіб вирішення проблеми:
((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1
Зауважте, що я повинен використовувати log1 двічі, і я повинен додати в обох випадках, як перший, який використовує параметр "-a" для команди "tee", а другий - ">>".
Роблячи котячий журнал1, ви отримуєте наступне:
STD1
STD2
-bash: sdfr: command not found
Зауважте, що помилка не відображається у другому рядку як слід.