Глядя на две команды отдельно:
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 направлен на тройник, то 2 тоже. Поскольку тройник дублирует поток, выходные данные отображаются как на консоли, так и записываются в файл? Следовательно, разница междуutility 2>&1 > output.logиutility 2>&1 | tee output.logявляетсяteeтем , что он дублирует поток это будет правильно.?