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

Как вы уже выяснили, вам понадобился пакет libcheese-gtk-dev. В будущем вы можете сэкономить себе головную боль при сопоставлении pkg-config с пакетами Ubuntu с помощью sudo apt-get build-dep ubiquity. Это установит все зависимости сборки для пакета.

1
задан 15 February 2014 в 03:38

5 ответов

Чтобы записать вывод команды в файл, в основном используются 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 Как стандартный вывод, так и стандартный поток ошибок будут перенаправлены только на файл, в терминале ничего не будет видно. Если файл уже существует, новые данные будут добавлены в конец файла. [F9] Стандартный выходной поток будет скопирован в файл, он все равно будет отображаться в терминале. Если файл уже существует, он перезаписывается. command | tee -a output.txt Стандартный выходной поток будет скопирован в файл, он все равно будет отображаться в терминале. Если файл уже существует, новые данные будут добавлены в конец файла. (*) У Bash нет сокращенного синтаксиса, который позволяет только конвейеру StdErr на вторую команду, которая понадобится здесь в сочетании с tee снова, чтобы завершить таблицу. Если вам действительно нужно что-то подобное, посмотрите на «Как подключить stderr, а не stdout?» на переполнение стека для некоторых способов, как это можно сделать, например. путем обмена потоками или с помощью замены процесса. command |& tee output.txt Как стандартный вывод, так и стандартные потоки ошибок будут скопированы в файл, пока они все еще видны в терминале. Если файл уже существует, он перезаписывается. command |& tee -a output.txt Как стандартный вывод, так и стандартные потоки ошибок будут скопированы в файл, пока они все еще видны в терминале. Если файл уже существует, новые данные будут добавлены в конец файла.
432
ответ дан 24 May 2018 в 11:47
  • 1
    Спасибо за стол, это отлично! Это должен быть главный ответ – DevShark 15 August 2016 в 19:24
  • 2
    Отличная информация! Можете ли вы также добавить детали 2 & gt; 1/1 & amp; 2/3 & amp; 1 & lt; – karthick87 19 September 2016 в 19:30
  • 3
    @ karthick87 Это не связано с вопросом о перенаправлении вывода в файл, поскольку он просто перенаправляет один поток на другой. 2>&1 перенаправляет STDERR на STDOUT, 1>&2 перенаправляет STDOUT в STDERR, а 3>&1 перенаправляет поток 3 в STDERR. – Byte Commander 19 September 2016 в 19:42
  • 4
    Просто примечание, что '| & amp;' не работал для меня на macOS. Это связано с тем, что у него более старая версия bash (я думаю). Менее элегантные «2 & gt; & amp; 1 |» отлично работает – Danny Parker 9 May 2017 в 13:01
  • 5
    |& не работает для меня в GNU bash, версия 4.3.11 (1) -release (x86_64-pc-linux-gnu). 2>&1 | tee вывел желаемый вывод StdOut и StdErr в заданный файл. – samkhan13 27 January 2018 в 16:54

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

command | tee ~/outputfile.txt

Небольшая модификация также будет захватывать stderr:

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

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

command |& tee ~/outputfile.txt

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

73
ответ дан 24 May 2018 в 11:47
  • 1
    tee полезен, если вы хотите, чтобы захватить вывод команды, а также просматривать его вживую. Сделайте эту строку полужирным шрифтом Aaron. Он будет выполнять две работы одновременно. Спасибо за ответ. – learner 2 November 2015 в 16:26
  • 2
    В нем говорится, что & amp; является неожиданным и не записывает журнал одновременно с запуском команды. Я использую это в файле bash, однако, это имеет значение? – tim687 6 April 2016 в 16:51
  • 3
    @ tim687 Я удалил это редактирование. Извините, что ... не был частью моего первоначального ответа. – Aaron 6 April 2016 в 17:11
  • 4
    @Aaron Спасибо! tee добавит файл в реальном времени, не так ли? У меня есть сценарий резервного копирования, который я использую, lol, резервное копирование моего компьютера, но ведение журнала не выполняется в режиме реального времени. Мой компьютер отправляется спать после завершения резервного копирования, и файл журнала пуст. Должен ли я использовать другую команду для регистрации команд? – tim687 7 April 2016 в 09:43
  • 5
    миллиард спасибо – Mahesha999 15 July 2016 в 11:33

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

your_command >/path/to/file

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

your_command >>/path/to/file
16
ответ дан 24 May 2018 в 11:47

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

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

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

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
10
ответ дан 24 May 2018 в 11:47
  • 1
    Как сохранить вывод таким образом, чтобы цвета сохранялись? Я хотел бы импортировать результат команды в libreoffice и сохранять цвета. – madrang 12 May 2015 в 09:36
  • 2
    @madrang: Я прочитал только ваш комментарий, но вы можете найти этот ответ полезным. – Sylvain Pineau 21 September 2015 в 13:41
  • 3
    О, почти точно, что я ищу. Как распечатать также на экране выход? – Sigur 24 December 2016 в 02:10
  • 4
    Обратите внимание, что многие команды, которые производят цветной вывод, например ls и grep, поддерживают --color=auto, который выводит цветовые коды только в том случае, если стандартный вывод является терминалом. – Eliah Kagan 3 September 2017 в 17:37

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

0
ответ дан 24 May 2018 в 11:47

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

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