Дивлячись на дві команди окремо:
utility 2>&1 >output.log
Тут, оскільки перенаправлення обробляються зліва направо, спочатку стандартний потік помилок спочатку буде переспрямований туди, куди йде стандартний вихідний потік (можливо, до консолі), а потім стандартний вихідний потік буде переспрямований у файл. Стандартний потік помилок не буде переспрямований до цього файлу.
Видимим ефектом цього буде те, що ви отримуєте те, що виробляється на стандартній помилці на екрані, і те, що виробляється на стандартному виході у файлі.
utility 2>&1 | tee output.log
Тут ви переспрямовуєте стандартну помилку на те саме місце, що і стандартний вихідний потік. Це означає, що обидва потоки будуть передані на tee
утиліту як єдиний перемежований вихідний потік, і що ці стандартні вихідні дані будуть збережені у заданому файлі tee
. Дані додатково будуть відтворені tee
на консолі (саме tee
це і дублює потоки даних).
Який із них використовується, залежить від того, що ви хочете досягти.
Зауважте, що ви не змогли б відтворити ефект другого конвеєра просто >
(як у utility >output.log 2>&1
, що дозволило б зберегти і стандартний вихід, і помилку у файлі). Вам потрібно буде використовувати дані tee
для отримання даних як у консолі, так і у вихідному файлі.
Додаткові нотатки:
Відомий ефект першої команди,
utility 2>&1 >output.log
було б те саме, що
utility >output.log
Тобто стандартний вихід йде у файл, а стандартна помилка йде на консоль.
Якщо в кінці кожної з вищезазначених команд був доданий наступний етап обробки, однак буде велика різниця:
utility 2>&1 >output.log | more_stuff
utility >output.log | more_stuff
У першому трубопроводі more_stuff
було б отримано те, що спочатку було стандартним потоком помилок, utility
як його стандартними вхідними даними, тоді як у другому трубопроводі, оскільки це тільки отриманий стандартний вихідний потік, який коли-небудь надсилається через трубу, more_stuff
частина трубопроводу не отримає нічого читати на стандартному вході.
utility 2>&1 | tee output.log
Ви хочете сказати, що оскільки 1 спрямований на tee, так само 2. Оскільки tee дублює потік, вихід відображається як на консолі, так і записується у файл? Отже, різниця міжutility 2>&1 > output.log
іutility 2>&1 | tee output.log
єtee
тим , що він дублює потік це буде правильно.?