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


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

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


397
2018-02-14 19:49


происхождения




ответы:


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

someCommand > someFile.txt  

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

someCommand >> someFile.txt

Если ты хочешь stderr тоже используйте это:

someCommand &> someFile.txt  

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

someCommand &>> someFile.txt  

390
2018-02-14 19:52



Обратите внимание, что someCommand 2> someFile.txt а также someCommand 2>> someFile.txt также перенаправляет stterr to someFile.txt - Slothworks
Я пытаюсь сделать это с помощью команды gcc, но это не сработает. Он работает с другими командами, но не с этим. Он просто создает выходной файл без ничего внутри него. - Nik-Lz
@ Nik-Lz Часто это происходит потому, что команда отправляет весь свой результат на stderr. Если gcc генерирует сообщения об ошибках, это кажется вероятным. См. Комментарий Slothworks о том, как записывать stderr вместо stdout. - Jonathan Hartley
NB: чтобы получить результат make команда в файл требует этого синтаксиса: make > someFile.txt 2>&1 (источник: linuxquestions.org/questions/linux-newbie-8/...) - Gabriel Staples
@KyleBridenstine Смотрите tee ответьте ниже (askubuntu.com/a/485762/44179) - Seth♦


Чтобы записать вывод команды в файл, в основном 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

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


539
2018-02-08 14:52



Спасибо за стол, это отлично! Это должен быть главный ответ - DevShark
@ karthick87 Это не связано с вопросом о перенаправлении вывода в файл, поскольку он просто перенаправляет один поток на другой. 2>&1 перенаправляет STDERR на STDOUT, 1>&2 перенаправляет STDOUT на STDERR и 3>&1 будет перенаправлять поток 3 в STDERR. - Byte Commander
Просто примечание, что «| &» не работает для меня на macOS. Это связано с тем, что у него более старая версия bash (я думаю). Менее элегантные «2> и 1 |» отлично работает - Danny Parker
что относительно n, y, y, y? - user1133275
@Jas для перенаправления потоков stderr (2) и stdout (1). - Byte Commander


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

command | tee ~/outputfile.txt

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

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

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

command |& tee ~/outputfile.txt

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


81
2018-06-20 04:45



tee полезно, если вы хотите иметь возможность захвата вывода команды, а также просматривать ее вживую. Сделайте эту строку жирный Аарон. Он будет выполнять две работы одновременно. Спасибо за ответ. - learner
В нем указано, что & является неожиданным и не записывает журнал одновременно с запуском команды. Я использую это в файле bash, однако, это имеет значение? - tim687
@ tim687 Я удалил это редактирование. Извините, что ... не был частью моего первоначального ответа. - Aaron
@Aaron Спасибо! tee добавит файл в реальном времени, не так ли? У меня есть сценарий резервного копирования, который я использую, lol, резервное копирование моего компьютера, но ведение журнала не выполняется в режиме реального времени. Мой компьютер отправляется спать после завершения резервного копирования, и файл журнала пуст. Должен ли я использовать другую команду для регистрации команд? - tim687
миллиард спасибо - Mahesha999


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

your_command >/path/to/file

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

your_command >>/path/to/file

17
2018-02-14 19:52



Большое спасибо ! есть ли ограничения? как максимальный размер файла? - led-Zepp
Максимальный размер файла ограничен только файловой системой - chaos
Этот ответ не спасет stderr. Используйте &>, см. stackoverflow.com/questions/637827/... а также tldp.org/LDP/abs/html/io-redirection.html - Panther
OP никогда не просил сэкономить stderr - chaos


Усиление рассмотрения -

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

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

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt

11
2017-07-08 20:57



Как сохранить вывод таким образом, чтобы цвета сохранялись? Я хотел бы импортировать результат команды в libreoffice и сохранять цвета. - madrang
@madrang: Я только что прочитал ваш комментарий, но вы можете найти это ответ полезно. - Sylvain Pineau
О, почти точно, что я ищу. Как распечатать также на экране выход? - Sigur
Обратите внимание, что многие команды, которые производят цветной вывод, например, ls а также grep, поддержка --color=auto, который выводит цветовые коды только в том случае, если стандартный вывод является терминалом. - Eliah Kagan


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

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

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


1
2018-04-11 12:25





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

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


0
2017-07-04 20:54



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