Как перенаправить stderr и stdout на разные файлы в одной строке скрипта?

180

Я знаю это очень много:

$ command 2>> error

$ command 1>> output

Есть ли способ вывести stderr в файл ошибок и вывести stdout в выходной файл в той же строке bash?

user784637
источник

Ответы:

292

Просто добавьте их в одну строку command 2>> error 1>> output

Тем не менее, обратите внимание, что >>это для добавления, если файл уже содержит данные. Принимая во внимание, что >будет перезаписывать любые существующие данные в файле.

Итак, command 2> error 1> outputесли вы не хотите добавлять.

Просто для завершения, вы можете написать 1>так же, >как и дескриптор файла по умолчанию является выходным. так 1>и >есть одно и то же.

Итак, command 2> error 1> outputстановится,command 2> error > output

Sujoy
источник
3
Отличный ответ! Мне очень нравится ваше объяснение того, как 1>можно написать как>
user784637
Чем это отличается от того, как command &2>err.logя думаю, я полностью сбиваю с толку синтаксис. (Ссылка на соответствующий ответ на все вопросы о bash может быть в порядке)
ThorSummoner
4
@ThorSummoner tldp.org/LDP/abs/html/io-redirection.html - это то, что, я думаю, вы ищете. Между прочим, выглядит command &2>err.logне совсем законно - амперсанд в этом синтаксисе используется для файлового дескриптора в качестве цели, например command 1>&2, перенаправляет stdout в stderr.
DreadPirateShawn
@DreadPirateShawn, пожалуйста, не связывайте АБС в качестве ссылки - он иногда содержит откровенные неточности и очень часто содержит примеры плохой практики. wiki.bash-hackers.org/howto/redirection_tutorial является гораздо лучшим справочным источником по перенаправлению.
Чарльз Даффи
27

Попробуй это:

your_command 2>stderr.log 1>stdout.log

Больше информации

Цифры 0через 9являются файловыми дескрипторами в bash. 0обозначает стандартный ввод, 1обозначает стандартный вывод, 2обозначает стандартную ошибку. 3через 9запасные для любого другого временного использования.

Любой файловый дескриптор может быть перенаправлен в файл или в другой файловый дескриптор с помощью оператора >. Вместо этого вы можете использовать оператор >>для добавления в файл вместо создания пустого.

Использование:

file_descriptor > filename

file_descriptor > &file_descriptor

Пожалуйста, обратитесь к Расширенному руководству по Bash-Scripting: Глава 20. Перенаправление ввода / вывода .

Quintus.Zhou
источник
Спасибо. Я искал это в течение одного часа
dılo sürücü
12

Как это:

$ command >>output 2>>error
Дидье Троссет
источник
9

Или, если вы хотите смешать выходные данные (stdout & stderr) в одном файле, который вы можете использовать:

command > merged-output.txt 2>&1
ztank1013
источник
32
Это не ответ на вопрос.
Матиас
Почему люди объединяют результаты или предлагают объединить результаты?
nurettin
@nurettin: может быть, у вас есть строка сценария, которая просто выполняет команду и мгновенно сохраняет вывод в файл журнала. Рассматриваемая команда может иногда завершаться сбоем, поэтому вы хотите сохранить все ошибки об этом, но в том же файле журнала.
streamofstars
@streamofstars да, конечно, вы правы, может быть, иногда это то, чего хотят люди, я комментировал в контексте этого вопроса, как кто-то, кто искал ответы и нашел много не относящихся к делу по всему стекопереходу.
nurettin
0

Вывод нескольких команд может быть перенаправлен. Это работает для командной строки или наиболее полезно в bash-скрипте. -sНаправляет запрос на ввод пароля на экране.

Здесь блоки cmds stdout / stderr отправляются в отдельные файлы и ничего не отображать.

sudo -s -u username <<'EOF' 2>err 1>out
ls; pwd;
EOF

Здесь блоки cmds stdout / stderr отправляются в один файл и отображаются.

sudo -s -u username <<'EOF' 2>&1 | tee out
ls; pwd;
EOF

Здесь блоки cmds stdout / stderr отправляются в отдельные файлы и stdout для отображения.

sudo -s -u username <<'EOF' 2>err | tee out
ls; pwd;
EOF

В зависимости от того, кто вы (whoami) и имя пользователя, пароль может или не может потребоваться.

rahogaboom
источник