Как перенаправить stdout и stderr в файл

Я запускаю сценарий bash, который создает файл журнала для выполнения команды

Я использую следующие

Command1 >> log_file
Command2 >> log_file

Это отправляет только стандартный вывод, а не стандартную ошибку, которая появляется на терминале.

Могу ли я зарегистрировать как stderr, так и stdout, зарегистрированные в файле?


person sdmythos_gr    schedule 23.09.2011    source источник


Ответы (5)


Если вы хотите войти в тот же файл:

command1 >> log_file 2>&1

Если вам нужны разные файлы:

command1 >> log_file 2>> err_file
person Mat    schedule 23.09.2011
comment
И просто чтобы избавить кого-то от разочарования, обратите внимание, что порядок важен: 2>&1 должен стоять после >> log_file. - person Rufflewind; 02.01.2014
comment
Почему >>, а не >? - person user3527975; 17.03.2016
comment
>> добавляется к файлу, > перезаписывается. Для получения более подробной информации найдите перенаправление оболочки. - person Mat; 17.03.2016
comment
Вариант, который просматривает, а не сохраняет файл журнала, например когда make выдает десять тысяч ошибок, которые прокручиваются за пределы экрана: vi <(make 2>&1). - person Camille Goudeseune; 01.03.2017
comment
и увидеть результат, который также будет сохранен в файл: command 2>&1 | tee log_file - person Jonathan Hartley; 26.08.2017
comment
Что делает в этом контексте '&'? - person xaxes; 10.01.2018
comment
@xaxes: >& - это единственный токен. См. Раздел «Дублирование файловых дескрипторов» на странице руководства bash (или весь раздел «ПЕРЕНАПРАВЛЕНИЕ»). - person Mat; 10.01.2018
comment
У меня есть file1.txt и file2.txt в текущем каталоге. Когда я запускаю: 1. ls file {1..5} .txt 1 ›res.txt 2› & 1: он дает правильный вывод в res.txt Но когда я пишу 2. ls file {1..5} .txt 1 ›Res.txt 2› res.txt: теперь он не дает правильного вывода в res.txt, здесь в res.txt какой-то вывод опущен по сравнению с тем, что должен был бы быть, если бы мы не перенаправляли какой-либо поток. Почему ? - person tusharRawat; 04.08.2020
comment
У меня это не работает. time echo hi >> e.log 2>&1 вывод time на stderr попадает в терминал, а не в файл. - person falsePockets; 01.04.2021
comment
mywiki.wooledge.org/BashFAQ/032 @falsePockets - person Mat; 01.04.2021

Самый простой синтаксис для перенаправления обоих:

command &> logfile

Если вы хотите добавить в файл вместо перезаписи:

command &>> logfile
person Costi Ciudatu    schedule 23.09.2011
comment
Не уверен, когда был добавлен этот оператор, но он может быть недоступен в более старых версиях Bash. Кажется, он работает на моей машине, на которой работает Gnu bash v3.2.48. - person James Wald; 10.04.2014
comment
@CostiCiudatu оператор & ›› не работает в Mac OS X; безопаснее использовать раствор Mat imo. - person James Fennell; 24.05.2014
comment
@JamesFennell Вы правы, я не знал об этом. Я поддержал принятый ответ :) - person Costi Ciudatu; 25.05.2014
comment
Для Bash 4+ есть версия, которая будет передавать другую команду: |&. См. Комментарии к этому вопросу. - person George Hilliard; 29.05.2015
comment
&> теперь работает должным образом в OS X 10.11.1 (похоже, это bash 3.2), просто для записи. - person LiberalArtist; 28.11.2015
comment
tldp.org/LDP/abs/html/io-redirection.html упоминает этот синтаксис как работающий начиная с окончательной версии Bash 4. - person cachvico; 29.01.2016
comment
Я считаю, что для добавления в любую оболочку, кроме Bash ›v3.2, вам нужно использовать: команда ›› файл журнала 2› & 1 - person Eki; 31.08.2016
comment
$ (команда 2 ›& 1) работает в bash 4.3.48 (1), а $ (команда &›) - нет. - person JohnMudd; 05.08.2017
comment
Я + 1. Наконец, bash соответствует лаконичности старого command >& logfile в tcsh. Возможно, мне уже пора сменить оболочку! - person personal_cloud; 03.10.2017

Вы можете сделать это так 2> & 1:

 command > file 2>&1
person Laurent Legrand    schedule 23.09.2011
comment
+1, 2>&1 перенаправляет файловый дескриптор 2 (stderr) на файловый дескриптор 1 (stdout) - person Sjoerd; 23.09.2011
comment
Зачем тебе здесь амперсанд? Т.е. почему это 2 ›& 1, а не 2› 1? - person btomtom5; 31.10.2019
comment
@ btomtom5 & означает дескриптор файла. Как бы иначе записать в файл с именем 1? - person vstepaniuk; 27.04.2020

Использовать:

command >>log_file 2>>log_file
person blankabout    schedule 23.09.2011

Используйте command 2>file Здесь 2 обозначает файловый дескриптор stderr. Вы также можете использовать 1 вместо 2, чтобы stdout перенаправлялся в 'файл'

person PaulDaviesC    schedule 24.09.2011