Глядя на две команды отдельно:
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
тем , что он дублирует поток это будет правильно.?