Как сохранить вывод терминала в файл?
Как сохранить вывод команды в файл?
Есть ли способ без использования какого-либо программного обеспечения? Я хотел бы знать, как.
10 ответов
Да, это возможно, просто перенаправить вывод в файл:
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
полезно, если вы хотите иметь возможность записывать вывод команды, а также просматривать ее в режиме реального времени.
Здесь есть два разных вопроса. Первый в названии:
Как сохранить вывод терминала в файл?
Второй вопрос в теле:
Как сохранить вывод команды в файл?
Все ответы, размещенные здесь, относятся ко второму вопросу, но ни один из них не касается первого вопроса, на который есть отличный ответ в 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
после каждогоcommnd
. - В
script
команда имеет дополнительное преимущество (или недостаток) перезагрузки~/.bashrc
когда он начнется. - В
script
команда показывает командную строку ($PS1
), за которым следуют введенные вами команды. - В
script
Команда записывает все детали в полном цвете.
Вы можете перенаправить вывод команды в файл:
your_command >/path/to/file
Чтобы добавить вывод команды в файл вместо перезаписи, используйте:
your_command >>/path/to/file
Улучшение, чтобы рассмотреть -
Различные сценарии будут вводить цветовые коды в вывод, который может не захламлять ваш файл журнала.
Чтобы это исправить, вы можете использовать программу sed для удаления этих кодов. Пример:
command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
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
Дополнительная информация: Как я могу сохранить вывод команды в файл в режиме реального времени?
За 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
который уже должен убедить вас, что это плохая идея.
Если вы хотите вывести в файл во время выполнения команды:
script -c ./path/to/executable.bash -f log.txt
Используйте возможности эмулятора терминала
Еще не упомянутый вариант, который также может сохранять цвета / цвета, заключается в использовании консольной программы, такой как
Konsole
(эмулятор терминала KDE/Plasma по умолчанию) — для сохранения вывода.
консоль
Konsole has:
File > Save output as...
ярлык Ctrl+ Shift+ S; это позволяет сохранить вывод в виде текстового файла или HTML, включая цвета! Я не уверен точно, сколько это сэкономит, но в моем тесте он включал только ~ 1000, всю прокрутку терминала (вы можете увеличить буфер, создав новый профиль, Профиль> Новый..., а затем изменить прокрутку настройки, чтобы захватывать больше; версия Konsole 4:21.08.1).
гном-терминал
gnome-terminal
также имеет «копировать вывод как HTML», что позволяет вставлять HTML в документ; он сохраняет цвет, но копирует только содержимое вывода, отображаемого в данный момент на экране AFAICT.
вообще
Вы можете, конечно, сделать прямое перетаскивание (удерживая левую кнопку мыши во время перетаскивания), а затем скопировать (ctrl+c, Правка > Копировать или щелкнуть правой кнопкой мыши и выбрать копирование).
другие?
Не стесняйтесь изменить этот ответ, включив в него другие популярные терминальные приложения. Мой любимый,
Yakuake
, похоже, не имеет этой функции, как и большинство популярных терминалов, которые я рассмотрел, включая terminal.app и Hyper.