Як зберегти вихідний термінал у файл?


688

Як зберегти вихід команди у файл?

Чи існує спосіб без використання програмного забезпечення? Я хотів би знати як.

Відповіді:


735

Так, можливо, просто перенаправляйте вихід на файл:

SomeCommand > SomeFile.txt  

Або якщо ви хочете додати дані:

SomeCommand >> SomeFile.txt

Якщо ви хочете stderr, скористайтеся цим:

SomeCommand &> SomeFile.txt  

або це додати:

SomeCommand &>> SomeFile.txt  

якщо ви хочете, щоб stderrі консоль, і вивід відображалися на консолі та у файлі, використовуйте це:

SomeCommand 2>&1 | tee SomeFile.txt

(Якщо ви хочете лише вихід, киньте 2вище)


15
Зверніть увагу , що someCommand 2> someFile.txtі someCommand 2>> someFile.txtтакож перенаправляє stterrна Somefile.txt
Slothworks

Я намагаюся зробити це за допомогою команди gcc, але це не працює. Він працює з іншими командами, але не з цією. Він просто створює вихідний файл, не маючи всередині нього нічого.
Нікос

@ Nik-Lz Часто це відбувається тому, що команда надсилає весь свій вихід на stderr. Якщо gcc генерує повідомлення про помилки, це здається ймовірним. Дивіться коментар Slothworks про те, як захопити stderr замість stdout.
Джонатан Хартлі

1
Примітка: для отримання виводу makeкоманди у файл потрібен замість цього синтаксис: make > someFile.txt 2>&1(джерело: linuxquestions.org/questions/linux-newbie-8/… )
Габріель

У мене проблема, що він припиняє записувати, коли файл досягає приблизно 8 Мб. Це відома межа?
relG

863

Для запису виводу команди у файл, в основному, існує 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знову для заповнення таблиці. Якщо вам дійсно потрібно щось подібне, будь ласка, подивіться на "Як прокласти трубу жорсткіше, а не stdout?" на переповнення стека для деяких способів, як це можна зробити, наприклад, замінивши потоки або використовуючи процедуру заміни.

  • command |& tee output.txt

    Як стандартний вихід, так і стандартний потік помилок буде скопійовано у файл, залишаючись видимим у терміналі. Якщо файл вже існує, він буде перезаписаний.

  • command |& tee -a output.txt

    Як стандартний вихід, так і стандартний потік помилок буде скопійовано у файл, залишаючись видимим у терміналі. Якщо файл вже існує, нові дані будуть додані в кінці файлу.


66
Дякую за стіл, це чудово! Це має бути найкраща відповідь
DevShark

3
@ karthick87 Це насправді не пов'язане з питанням про перенаправлення виводу у файл, оскільки він просто перенаправляє один потік до іншого. 2>&1перенаправляє STDERR на STDOUT, 1>&2перенаправляє STDOUT на STDERR і 3>&1переспрямовує потік 3 на STDERR.
Байт-командир

18
Лише зауваження, що "| &" не працювало для мене на macOS. Це пов’язано з тим, що у мене є старша версія bash (я думаю). Менш елегантний '2> & 1 |' працює чудово, хоча
Danny Parker

2
@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. Я отримав те, що мені потрібно, тому я відмовляюся від сортування дивацтва між моїм сервером shі bashна ньому. Дякую.
samkhan13

1
@ samkhan13 виглядає так, що ти працюєш, shа не bash(або, можливо, bashв shрежимі ...). Ви можете перевірити, для чого саме використовується ваш поточний процес оболонки ps -p $$ -o cmd=, оскільки echo $SHELLвін недостовірний і покаже вам свою оболонку входу, ігноруючи, чи могли ви почати іншу підзарядку.
Байт-командир

108

Ви також можете використовувати teeдля надсилання виводу у файл:

command | tee ~/outputfile.txt

Невелика модифікація також спричинить більш жорсткі зміни:

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

або трохи коротше і менш складне:

command |& tee ~/outputfile.txt

teeкорисно, якщо ви хочете мати можливість фіксувати вихід команд, одночасно переглядаючи його в прямому ефірі .


Він говорить про те, що & несподівано, і не записує журнал одночасно з запуском команди. Я використовую це у файлі bash, але це має значення?
tim687

@ tim687 Я видалив цю редакцію. Вибачте з цього приводу ... не було частиною моєї оригінальної відповіді.
Аарон

@Aaron Дякую! tee додасть файл у режимі реального часу, правда? У мене є резервний скрипт, який я використовую, lol, створюю резервну копію ПК, але ведення журналу не в режимі реального часу. Після завершення резервного копіювання мій ПК переходить у режим сну, а файл журналу порожній. Чи слід використовувати іншу команду для реєстрації команд?
tim687

як я трактую значення 2>&1?
Mahesha999

@ Mahesha999 2 - дескриптор файлу для STDERR, а 1 - для STDOUT. Так що 2> і 1 посилає STDERR в STDOUT. Це питання ТАК пояснює це досить добре: stackoverflow.com/questions/818255/…
Аарон

20

Ви можете перенаправити командний вихід у файл:

your_command >/path/to/file

Щоб додати командний вихід до файлу, а не перезаписувати його, використовуйте:

your_command >>/path/to/file

Дуже дякую ! чи є обмеження? як максимальний розмір файлу?
Вел-Зепп

3
Максимальний розмір файлу обмежений лише через файлову систему
хаос

Ця відповідь не врятує жорсткішого. Використовуйте &>, см stackoverflow.com/questions/637827 / ... і tldp.org/LDP/abs/html/io-redirection.html
Panther

3
ОП ніколи не просили врятувати stderr
хаос

Там написано "Немає такого файлу чи каталогу". Чи можливо також автоматично створювати каталоги?
Qwerty

14

Поліпшення, яке слід врахувати -

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

Щоб виправити це, ви можете скористатися програмою sed, щоб викреслити ці коди. Приклад:

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

1
Як зберегти вихід таким чином, щоб збереглися кольори? Я хотів би імпортувати результат команди в libreoffice і зберегти кольори.
мадранг

@madrang: Я читаю лише ваш коментар зараз, але ви можете вважати цю відповідь корисною.
Сільвен Пано

О, майже саме те, що я шукаю. Як надрукувати також на екрані вихід?
Сигур

1
Зауважте, що багато команд, що створюють кольоровий вихід, наприклад, lsта grep, підтримують --color=auto, які виводять кольорові коди, лише якщо стандартний вихід є терміналом.
Елія Каган

5

Для cronзавдань тощо ви хочете уникати розширень Bash. Еквівалентними shоператорами перенаправлення POSIX є

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

Ви помітите, що засоби POSIX у певному сенсі простіші та простіші. &>Синтаксис запозичений з cshяких вже має переконати вас , що це погана ідея.


1

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

Додаткова інформація: Як я можу зберегти командний вихід у файл у режимі реального часу?


Вони зберігають вихід, коли вони отримують його, проблема полягає в тому, що python включає буферизацію, коли вихід не є TTY. Інші опції для відключення цього в Python: stackoverflow.com/q/107705/2072269
Мура
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.