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

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

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

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

SomeCommand > SomeFile.txt  

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

SomeCommand >> SomeFile.txt

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

SomeCommand &> SomeFile.txt  

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

SomeCommand &>> SomeFile.txt  

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

SomeCommand 2>&1 | tee SomeFile.txt

(Если вам нужен только вывод, отбросьте 2 выше)

Для записи выходных данных команды в файл существует в основном 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

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

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

command | tee ~/outputfile.txt

Небольшое изменение также приведет к перехвату stderr:

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

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

command |& tee ~/outputfile.txt

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

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

your_command >/path/to/file

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

your_command >>/path/to/file

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

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

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

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

Здесь есть два разных вопроса. Первое - в названии:

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

Второй вопрос заключается в теле:

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

Все ответы, опубликованные здесь, касаются второго вопроса, но ни один из них не касается первого вопроса, на который есть отличный ответ в Unix и Linux:

В этом ответе используется малоизвестная команда, называемая script который сохраняет все выходные данные вашей оболочки в текстовый файл до тех пор, пока вы не введете exit. Вывод команды по-прежнему отображается на вашем экране, но также отображается в текстовом файле.

Процесс очень прост. Воспользуйся:

$ script ~/outputfile.txtScript started, file is /home/rick/outputfile.txt$ command1$ command2$ command3$ exitexitScript done, file is /home/rick/outputfile.txt

Затем посмотрите на ваш записанный вывод команд 1, 2 и 3 с:

cat ~/outputfile.txt

Это похоже на более ранний ответ от:

command |& tee ~/outputfile.txt
  • Но вам не обязательно использовать |& tee ~/outputfile.txt после каждого commnd.
  • То script команда имеет дополнительное преимущество (или недостаток) перезагрузки ~/.bashrc когда это начнется.
  • То script команда показывает командную строку ($PS1), за которым следует введенная вами команда (команды).
  • То script команда записывает все детали в полном цвете.

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

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


Пример:

sudo apt-get install expectunbuffer some_command | tee command.logunbuffer some_command > command.log

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

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

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

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

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

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

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

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

script -c ./path/to/executable.bash -f log.txt