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

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

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

1120
задан 15 February 2014 в 01:38

8 ответов

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

SomeCommand > SomeFile.txt  

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

SomeCommand >> SomeFile.txt

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

SomeCommand &> SomeFile.txt  

или это для добавления:

SomeCommand &>> SomeFile.txt  

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

SomeCommand 2>&1 | tee SomeFile.txt

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

1137
ответ дан 15 February 2014 в 01:38
  • 1
    Я получаю сообщение об ошибке: ' E: Неспособный определить местоположение пакета firmware-atheros' – evandewey 4 August 2015 в 03:51

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

Обзор:

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

          || 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

Список:

  • команда> 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 во вторую команду, которая может понадобиться здесь в комбинации с тройником еще раз, чтобы заполнить таблицу. Если вам действительно нужно что-то подобное, пожалуйста, посмотрите "Как передать stderr, а не stdout?" в Stack Overflow , чтобы узнать, как это можно сделать, например путем обмена потоками или с помощью подстановки процессов.

  • command | & tee output.txt

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

  • command | & tee -a output.txt

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

1168
ответ дан 15 February 2014 в 01:38

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

command | tee ~/outputfile.txt

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

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

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

command |& tee ~/outputfile.txt

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

118
ответ дан 15 February 2014 в 01:38

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

your_command >/path/to/file

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

your_command >>/path/to/file
20
ответ дан 15 February 2014 в 01:38

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

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

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

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
16
ответ дан 15 February 2014 в 01:38

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

8
ответ дан 15 February 2014 в 01:38

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

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

5
ответ дан 15 February 2014 в 01:38

Здесь есть два разных вопроса. Первый находится в заголовке:

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

Второй вопрос находится в теле:

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

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

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

Процесс прост. Используйте:

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

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

cat ~/outputfile.txt

Это похоже на предыдущий ответ из:

command |& tee ~/outputfile.txt
  • Но вам не нужно использовать ] | & tee ~ / outputfile.txt после каждой команды .
  • Команда script имеет дополнительные преимущества (или недостатки) перезагрузки ~ / .bashrc при запуске.
  • Команда script показывает командную строку ( $ PS1 ), за которой следуют введенные вами команды.
  • Команда script записывает все подробности в полном цвете.
8
ответ дан 5 January 2021 в 23:12

Другие вопросы по тегам:

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