Перенаправить весь вывод в файл [дубликата]

611

Я знаю, что в Linux, чтобы перенаправить вывод с экрана на файл, я могу либо использовать >, либо tee. Тем не менее, я не уверен, почему часть вывода по-прежнему выводится на экран и не записывается в файл.

Есть ли способ перенаправить весь вывод в файл?

Теги:
io-redirection

10 ответов

958
Лучший ответ

Эта часть написана в stderr, используйте 2> для перенаправления. Например:

foo > stdout.txt 2> stderr.txt

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

foo > allout.txt 2>&1

Примечание: это работает в (ba) sh, проверьте вашу оболочку для правильного синтаксиса

  • 11
    Ну, я нашел ссылку и удалил мой пост за неправильную информацию. из руководства по bash: «ls 2> & 1> dirlist» направляет только стандартный вывод на dirlist, потому что стандартная ошибка была продублирована со стандартного вывода до того, как стандартный вывод был перенаправлен на dirlist »:)
  • 12
    также из bash man "Существует два формата для перенаправления стандартного вывода и стандартной ошибки: &> word и> & word. Из двух форм предпочтительной является первая. Это семантически эквивалентно> word 2> & 1"
Показать ещё 10 комментариев
126

Все операционные системы POSIX имеют 3 потока: stdin, stdout и stderr. stdin - это вход, который может принимать stdout или stderr. stdout является основным выходом, который перенаправляется с помощью >, >> или |. stderr - это вывод ошибки, который обрабатывается отдельно, поэтому любые исключения не передаются команде или не записываются в файл, который может быть break; обычно, это отправляется в какой-либо журнал или выгружается напрямую, даже когда stdout перенаправляется. Чтобы перенаправить оба на одно и то же место, используйте:

command &> /some/fileудаp >

EDIT: благодаря Заку за то, что указанное решение не переносимо - используйте вместо этого:

*command* > file 2>&1 

Если вы хотите отключить эту ошибку, выполните следующие действия:

*command* 2> /dev/null
  • 1
    кажется &> и 2> &! оба делают одно и то же?
  • 22
    &> file (aka >& file ) не является частью официальной спецификации оболочки POSIX, но был добавлен ко многим оболочкам Bourne в качестве дополнительного удобства (изначально он поставляется из csh ). В переносимом сценарии оболочки (и если вам не нужна переносимость, зачем вы пишете сценарий оболочки?), Используйте только > file 2>&1 .
Показать ещё 1 комментарий
59

Чтобы получить вывод на консоли И в файле file.txt, например.

make 2>&1 | tee file.txt

Примечание: &2>&1) указывает, что 1 не является именем файла, а файловым дескриптором.

  • 0
    Кстати, tee -a file.txt означает добавление к файлу.
30

Используйте это - "require command here" > log_file_name 2>&1

Подробное описание оператора перенаправления в Unix/Linux.

Оператоp > перенаправляет вывод обычно в файл, но может быть на устройство. Вы также можете использовать → для добавления.

Если вы не укажете число, то предполагается стандартный поток вывода, но вы также можете перенаправить ошибки

> file redirects stdout to file
1> file redirects stdout to file
2> file redirects stderr to file
&> file redirects stdout and stderr to file

/dev/null - это нулевое устройство, которое требует любого ввода, который вы хотите, и отбрасывает его. Он может использоваться для подавления любого выхода.

  • 1
    Оператор перенаправления в Unix / Linux? Какая оболочка?
  • 2
    это будет работать как в Unix, так и в Linux, и независимо от используемой оболочки.
14

Это может быть стандартная ошибка. Вы можете перенаправить его:

... > out.txt 2>&1
13

Кредиты для osexp2003 и j.a....


Вместо того, чтобы ставить

&>> your_file.log

за строкой в ​​

crontab -e

Я использую

#!/bin/bash
exec &>> your_file.log
…

в начале BASH script.

Преимущество. У вас есть определения журнала в вашем script. Хорошо для Git и т.д.

  • 0
    Именно то, что я хотел, спасибо! В моем случае я не выполняю скрипт напрямую (его вызывает некий скрипт-обертка, который я не контролирую), поэтому я не могу указать перенаправление ввода после команды
  • 0
    Я был рад поддержать вас. Кстати, я хотел бы отметить, что пример, который я не использую (crontab), даже не работает, потому что crontab использует SH, а не BASH. Чтобы получить дальнейшие здесь, другие ответы могут помочь. А если вы не знаете, &>> /dev/null работает только с BASH и перенаправляет как STANDARD_OUT (1), так и STANDARD_ERROR (2) в нирвану (3 - STANDARD_IN). В этом конкретном случае не имеет значения, перезаписываете ли вы ( &> ) или добавляете ( &>> ).
10

Команда:

foo >> output.txt 2>&1

добавляет в файл output.txt без замены содержимого.

  • 1
    у меня это работало внутри crontab для скриптов в R, Ubuntu 14.
10

Вы можете использовать команду exec для перенаправления всех выходных данных stdout/stderr любых команд позже.

образец script:

exec 2> your_file2 > your_file1
your other commands.....
6

Используйте >> для добавления:

command >> file

  • 6
    Это связано с исходным вопросом, но не отвечает на него.
  • 1
    Не отвечает, но обычно неправильно понимают и первый ответ на самом деле предполагает, что> и >> и | были взаимозаменяемы. то есть - это не стоило вашего отрицательного ответа.
-2

В Linux Mint эта командная строка маршрутизировала выполнение script и ошибок в один файл txt. bash -x ./setup.sh > setup.txt 2>&1. script name был setup.sh, а выходным пунктом был setup.txt.

  • 5
    Это тот же ответ, который был опубликован здесь несколько лет назад, за исключением того, что он не содержит объяснений.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню