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

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

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

687
задан 11.05.2020, 09:50

7 ответов

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

SomeCommand > SomeFile.txt  

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

SomeCommand >> SomeFile.txt

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

SomeCommand &> SomeFile.txt  

или это, чтобы добавить:

SomeCommand &>> SomeFile.txt  

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

SomeCommand 2>&1 | tee SomeFile.txt

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

735
ответ дан 11.05.2020, 09:52
  • 1
    @Nik-Lz Часто это вызвано тем, что команда отправляет весь свой вывод на stderr. Если gcc генерирует сообщения об ошибках, это кажется вероятным. См. комментарий Slothworks для того, как получить stderr вместо stdout. – Farokh KH 11.05.2020, 09:52
  • 2
    Обратите внимание что someCommand 2> someFile.txt и someCommand 2>> someFile.txt также перенаправления stterr к someFile.txt – Zed 11.05.2020, 09:53
  • 3
    NB: для получения вывода эти make команда в файл, это требует этого синтаксиса вместо этого: make > someFile.txt 2>&1 (источник: linuxquestions.org/questions/linux-newbie-8/… ) – ibo.ezhe 11.05.2020, 09:53
  • 4
    У меня есть проблема, которую это прекращает писать, когда файл достигает приблизительно 8 МБ. Действительно ли это - известный предел? – Dana the Sane 11.05.2020, 09:53
  • 5
    @KyleBridenstine Видят эти tee ответ ниже ( askubuntu.com/a/485762/44179 ) – Vortex 11.05.2020, 09:54
  • 6
    I' m пытающийся сделать это с командой gcc, но этим doesn' t работа. Это работает с другими командами, но не этим. Это просто создает выходной файл ни с чем в нем. – H6. 11.05.2020, 09:54

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

command | tee ~/outputfile.txt

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

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

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

command |& tee ~/outputfile.txt

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

108
ответ дан 11.05.2020, 09:51
  • 1
    @Mahesha999 2 является дескриптором файла для STDERR, и 1 для STDOUT. Так, чтобы 2> & 1 отправляет STDERR в STDOUT. Это ТАК вопрос объясняет это вполне прилично: stackoverflow.com/questions/818255/… – Seun Osewa 11.05.2020, 09:51
  • 2
    tee полезно, если Вы хотите быть в состоянии получить вывод команды, также просматривая он живет. Сделайте эту строку полужирной Aaron. Это будет делать две работы за один раз. Спасибо за ответ. – bruno desthuilliers 11.05.2020, 09:52
  • 3
    @tim687 я удалил то редактирование. Извините за это... wasn' t часть моего исходного ответа. – Max 11.05.2020, 09:52
  • 4
    @Aaron Спасибо! кладут для первого удара, добавит файл в режиме реального времени, правильно? У меня есть резервный сценарий, который я использую для, lol, резервирую свой ПК, но вход не в режиме реального времени. Мой ПК засыпает после того, как резервное копирование закончено, и файл журнала пуст. Я должен использовать другую команду для входа команд? – Andrew Whitehouse 11.05.2020, 09:52
  • 5
    Это говорит что & неожиданно, и doesn' t пишут журнал в то же время, что и команда работает. Я использую это в файле удара однако, который имеет какое-либо значение? – Hippicoder 11.05.2020, 09:53
  • 6
    как я интерпретирую значение 2>&1? – Javier 11.05.2020, 09:53

Для 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, который уже должен убедить вас, что это плохая идея.

5
ответ дан 11.05.2020, 09:51

Усовершенствование, которое следует учитывать -

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

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

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
14
ответ дан 11.05.2020, 09:52
  • 1
    @madrang: Я только прочитал Ваш комментарий теперь, но можно найти этот ответ полезный. – Andrew Whitehouse 11.05.2020, 09:53
  • 2
    Обратите внимание, что много команд, которые производят цветной вывод, такой как ls и grep, поддерживают --color=auto, который выходные цветовые коды, только если стандартный вывод является терминалом. – Dmitry 11.05.2020, 09:53
  • 3
    О, почти точно, что я ищу. Как распечатать также на экране вывод? – Alexander Ulitin 11.05.2020, 09:54
  • 4
    Как сохранить вывод способом, который сохраняются цвета? Я хотел бы импортировать результат команды в libreoffice и сохранить цвета. – gabereal 11.05.2020, 09:54

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

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

  • [Тысяча сто пятьдесят шесть]
862
ответ дан 11.05.2020, 09:53
  • 1
    @samkhan13 похож на Вас, работают sh а не bash (или возможно bash в sh режим...). Можно проверить то, что точно текущий процесс оболочки использует ps -p $ -o cmd=, потому что echo $SHELL ненадежно и покажет Вам Вашу оболочку входа в систему, игнорируя возможно, ли Вы, запустили различную подоболочку. – jww 11.05.2020, 09:53
  • 2
    Просто примечание это ' | & ' wasn' t работающий на меня на macOS. Это происходит из-за него имеющий более старую версию удара (я думаю). Менее изящный ' 2> & 1 | ' хорошо работает хотя – Hippicoder 11.05.2020, 09:53
  • 3
    @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. Я получил то, что мне был нужен так I' m отказывающийся от сортировки странности между sh и bash на моем сервере. Спасибо. – Evan Teran 11.05.2020, 09:54
  • 4
    Спасибо за таблицу, it' s превосходный! Это должно быть главным ответом – Rui Curado 11.05.2020, 09:54
  • 5
    @karthick87 Это действительно не связано с вопросом о перенаправлении вывода в файл, потому что это просто перенаправляет один поток другому. 2>&1 перенаправления STDERR к STDOUT, 1>&2 перенаправления STDOUT к STDERR и 3>&1 перенаправил бы поток 3 к STDERR. – kwesolowski 11.05.2020, 09:55

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

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

1
ответ дан 11.05.2020, 09:53
  • 1
    Они действительно сохраняют вывод, поскольку они получают его, проблема состоит в том, что Python включает буферизацию, когда вывод не к TTY. Другие опции для отключения этого в Python: stackoverflow.com/q/107705/2072269 – pinge 11.05.2020, 09:53

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

your_command >/path/to/file

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

your_command >>/path/to/file
20
ответ дан 11.05.2020, 09:54

Теги

Похожие вопросы