Как сохранить вывод терминала в файл?

691

Как сохранить вывод команды в файл?

Есть ли способ без использования какого-либо программного обеспечения? Я хотел бы знать, как.

Светодиодное Zepp
источник

Ответы:

738

Да, это возможно, просто перенаправить вывод в файл:

SomeCommand > SomeFile.txt  

Или, если вы хотите добавить данные:

SomeCommand >> SomeFile.txt

Если вы также хотите stderrиспользовать это:

SomeCommand &> SomeFile.txt  

или это добавить:

SomeCommand &>> SomeFile.txt  

если вы хотите, чтобы stderrи консоль, и вывод отображались на консоли и в файле, используйте это:

SomeCommand 2>&1 | tee SomeFile.txt

(Если вы хотите только вывод, опустите 2выше)

Сет
источник
15
Обратите внимание, что someCommand 2> someFile.txtи someCommand 2>> someFile.txtтакже перенаправляет stterrна someFile.txt
Slothworks
Я пытаюсь сделать это с помощью команды gcc, но это не работает. Он работает с другими командами, но не с этой. Он просто создает выходной файл, в котором ничего нет.
Никос,
@ Nik-Lz Часто это происходит потому, что команда отправляет весь свой вывод на stderr. Если gcc генерирует сообщения об ошибках, это кажется вероятным. См. Комментарий Slothworks о том, как захватить stderr вместо stdout.
Джонатан Хартли,
1
Примечание: чтобы получить выходные данные makeкоманды в файл, вместо этого требуется следующий синтаксис: make > someFile.txt 2>&1(источник: linuxquestions.org/questions/linux-newbie-8/… )
Габриэль Стейплс
У меня проблема, что он перестает писать, когда файл достигает около 8 МБ. Это известный предел?
RelG
868

Чтобы записать вывод команды в файл, существует в основном 10 часто используемых способов.

Обзор:

Обратите внимание, что n.e.в столбце синтаксиса означает «не существует».
Есть способ, но он слишком сложен, чтобы вписаться в колонку. Вы можете найти полезную ссылку в разделе «Список».

          || visible in terminal ||   visible in file   || existing
  Syntax  ||  StdOut  |  StdErr  ||  StdOut  |  StdErr  ||   file   
==========++==========+==========++==========+==========++===========
    >     ||    no    |   yes    ||   yes    |    no    || overwrite
    >>    ||    no    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
   2>     ||   yes    |    no    ||    no    |   yes    || overwrite
   2>>    ||   yes    |    no    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
   &>     ||    no    |    no    ||   yes    |   yes    || overwrite
   &>>    ||    no    |    no    ||   yes    |   yes    ||  append
          ||          |          ||          |          ||
 | tee    ||   yes    |   yes    ||   yes    |    no    || overwrite
 | tee -a ||   yes    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    || overwrite
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
|& tee    ||   yes    |   yes    ||   yes    |   yes    || overwrite
|& tee -a ||   yes    |   yes    ||   yes    |   yes    ||  append

Список:

  • command > output.txt

    Стандартный поток вывода будет перенаправлен только в файл, он не будет виден в терминале. Если файл уже существует, он перезаписывается.

  • command >> output.txt

    Стандартный поток вывода будет перенаправлен только в файл, он не будет виден в терминале. Если файл уже существует, новые данные будут добавлены в конец файла.

  • command 2> output.txt

    Стандартный поток ошибок будет перенаправлен только в файл, он не будет виден в терминале. Если файл уже существует, он перезаписывается.

  • command 2>> output.txt

    Стандартный поток ошибок будет перенаправлен только в файл, он не будет виден в терминале. Если файл уже существует, новые данные будут добавлены в конец файла.

  • command &> output.txt

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

  • command &>> output.txt

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

  • command | tee output.txt

    Стандартный поток вывода будет скопирован в файл, он все равно будет виден в терминале. Если файл уже существует, он перезаписывается.

  • command | tee -a output.txt

    Стандартный поток вывода будет скопирован в файл, он все равно будет виден в терминале. Если файл уже существует, новые данные будут добавлены в конец файла.

  • (*)

    Bash не имеет сокращенного синтаксиса, который позволяет передавать только StdErr для второй команды, которая потребуется здесь в сочетании с teeснова для завершения таблицы. Если вам действительно нужно что-то подобное, пожалуйста, посмотрите на "Как транслировать stderr, а не stdout?" Переполнение стека для некоторых способов, как это можно сделать, например, путем обмена потоками или с помощью подстановки процесса.

  • command |& tee output.txt

    Как стандартный вывод, так и стандартные потоки ошибок будут скопированы в файл, пока они будут видны в терминале. Если файл уже существует, он перезаписывается.

  • command |& tee -a output.txt

    Как стандартный вывод, так и стандартные потоки ошибок будут скопированы в файл, пока они будут видны в терминале. Если файл уже существует, новые данные будут добавлены в конец файла.

Byte Commander
источник
66
Спасибо за стол, это отлично! Это должен быть главный ответ
DevShark
3
@ karthick87 На самом деле это не связано с вопросом о перенаправлении вывода в файл, потому что он просто перенаправляет один поток в другой. 2>&1перенаправляет STDERR в STDOUT, 1>&2перенаправляет STDOUT в STDERR и 3>&1перенаправляет поток 3 в STDERR.
Byte Commander
18
Просто замечание, что «| &» не работает для меня в macOS. Это связано с более старой версией bash (я думаю). Менее элегантные '2> & 1 |' работает отлично, хотя
Дэнни Паркер
2
@ByteCommander Я получаю сообщение об ошибке: sh: 1: Syntax error: "&" unexpectedпри использовании |& teeиз скрипта Python на сервере c9.io. Кажется, используется другая оболочка. echo $SHELLпоказывает /bin/bashи $SHELL --versionпоказывает версию 4.3.11 (1) -релиз. Я пробовал #!/bin/bashв своем скрипте Python, но я все еще получаю sh: 1: Syntax error. Я получил то, что мне было нужно, поэтому я разочаровался в сортировке странностей между shи bashна моем сервере. Благодарю.
samkhan13
1
@ samkhan13 похоже, что вы работаете, shа не bash(или, может быть, bashв shрежиме ...). Вы можете проверить, что именно использует ваш текущий процесс оболочки ps -p $$ -o cmd=, потому что echo $SHELLон ненадежен и покажет вам вашу оболочку входа в систему, игнорируя, возможно, вы запустили другую подоболочку.
Byte Commander
108

Вы также можете использовать teeдля отправки вывода в файл:

command | tee ~/outputfile.txt

Небольшая модификация также поймает stderr:

command 2>&1 | tee ~/outputfile.txt

или немного короче и менее сложный:

command |& tee ~/outputfile.txt

teeполезно, если вы хотите иметь возможность записывать вывод команды, а также просматривать ее в режиме реального времени .

Аарон
источник
Он говорит, что & является неожиданным, и не записывает журнал одновременно с выполнением команды. Я использую это в файле Bash, однако, это имеет какое-либо значение?
tim687
@ tim687 Я удалил это редактирование. Извините за это ... не было частью моего первоначального ответа.
Аарон
@ Аарон Спасибо! Вы добавите файл в режиме реального времени, верно? У меня есть сценарий резервного копирования, который я использую для создания резервной копии моего компьютера, но ведение журнала не в режиме реального времени. Мой компьютер переходит в спящий режим после завершения резервного копирования, и файл журнала пуст. Должен ли я использовать другую команду для регистрации команд?
tim687
как я могу интерпретировать значение 2>&1?
Mahesha999
@ Mahesha999 2 - дескриптор файла для STDERR, а 1 - для STDOUT. Так что 2> & 1 отправляет STDERR в STDOUT. Этот вопрос SO объясняет это довольно хорошо: stackoverflow.com/questions/818255/…
Аарон
20

Вы можете перенаправить вывод команды в файл:

your_command >/path/to/file

Чтобы добавить вывод команды в файл вместо перезаписи, используйте:

your_command >>/path/to/file
хаос
источник
Большое спасибо ! Есть ли ограничения? как максимальный размер файла?
led-Zepp
3
Максимальный размер файла просто ограничен файловой системой
хаос
Этот ответ не спасет stderr. Используйте &>, см stackoverflow.com/questions/637827/... и tldp.org/LDP/abs/html/io-redirection.html
Panther
3
ОП никогда не просил спасти stderr
хаос
Там написано "Нет такого файла или каталога". Можно ли также автоматически создавать каталоги?
Qwerty
14

Улучшение, чтобы рассмотреть -

Различные сценарии будут вводить цветовые коды в вывод, который может не захламлять ваш файл журнала.

Чтобы это исправить, вы можете использовать программу sed для удаления этих кодов. Пример:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
Шон Хубер
источник
1
Как сохранить вывод таким образом, чтобы цвета сохранялись? Я хотел бы импортировать результат команды в libreoffice и сохранить цвета.
Мадранг
@madrang: Я только читаю ваш комментарий сейчас, но вы можете найти этот ответ полезным.
Сильвен Пино
О, почти то, что я ищу. Как распечатать также на экране вывод?
Сигур
1
Обратите внимание, что многие команды, которые производят цветной вывод, такие как lsи grep, поддерживают --color=auto, который выводит цветовые коды, только если стандартный вывод является терминалом.
Элия ​​Каган
5

Для cronработы и т. Д. Вы хотите избежать расширений Bash. Эквивалентные shоператоры перенаправления POSIX

Bash          POSIX
------------  --------------
foo &> bar    foo >bar 2>&1
foo &>> bar   foo >>bar 2>&1
foo |& bar    foo 2>&1 | bar

Вы заметите, что средство POSIX в некотором смысле проще и понятнее. &>Синтаксис заимствован из cshкоторых уже должен убедить вас , что это плохая идея.

tripleee
источник
1

some_command | tee command.logи some_command > command.logпроблема в том, что они не сохраняют вывод команды в command.logфайл в режиме реального времени.

Чтобы избежать этой проблемы и сохранить вывод команды в режиме реального времени, вы можете добавить unbuffer, который поставляется с expectпакетом.


Пример:

sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log

Предполагая, log.pyсодержит:

import time
print('testing')
time.sleep(100) # sleeping for 100 seconds

ты можешь бежать unbuffer python log.py | tee command.logилиunbuffer python log.py > command.log

Дополнительная информация: Как я могу сохранить вывод команды в файл в режиме реального времени?

Франк Дернонкур
источник
Они сохраняют вывод при получении, проблема в том, что питон включает буферизацию, когда вывод не в TTY. Другие варианты отключения этого в Python: stackoverflow.com/q/107705/2072269
Muru