Захоплення STDERR та STDOUT до файлу за допомогою трійника


16

Мені незрозуміло, який найкращий порядок - це захоплення і одного STDERRі STDOUTтого ж файлу за допомогою tee. Я знаю, що якщо я хочу передати файл, мені доведеться зіставити файл файлу після перенаправлення, тобто

find . >/tmp/output.txt 2>&1

Це вказує на оболонку , щоб відправити STDOUTна , /tmp/output.txtа потім відправити STDERRна STDOUT(тепер відправка /tmp/output.txt).

Спроба виконати 2>&1попереднє перенаправлення файлу не матиме бажаного ефекту.

Однак коли я хочу використовувати трубу, teeце:

find . |tee /tmp/output.txt 2>&1   # or
find . 2>&1 |tee /tmp/output.txt   # ?

Відповіді:


19

Лист; він гарантує, що STDOUT та STDERR вихідної команди переходять на один і той же fd, а потім спільно подають їх у tee. У першому випадку ви приєднаєтесь до STDOUT команди STDERR команди tee.


5
Цікаво, що на сторінці bash man сказано: "Якщо |&використовується, стандартна помилка command1 з'єднана зі стандартним входом command2 через трубу; це скорочення 2>&1 |. Це неявне перенаправлення стандартної помилки виконується після будь-яких перенаправлень, визначених командою."
ПП.

Мені довелося створити невелику програму на С, яка пише і для, stderrі stdoutдля розуміння цього питання. Оператори переадресації >та трійника |відрізняються при спробі захоплення обох вихідних потоків. Для перенаправлення мені довелося ./testapp > /tmp/out.log 2>&1. Тоді як для трійника я повинен був ./testapp 2>&1 | tee /tmp/out.log.
шрифт

@daixtr того, що воно варте, |зазвичай називають трубним оператором. teeстосується лише певної програми, яка викликається на дальньому кінці труби.
MadHatter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.