Как мне сохранить выходные данные команды в файл?
Есть ли способ без использования какого-либо программного обеспечения? Я хотел бы знать, как это сделать.
Как мне сохранить выходные данные команды в файл?
Есть ли способ без использования какого-либо программного обеспечения? Я хотел бы знать, как это сделать.
Да, это возможно, просто перенаправьте вывод (он же 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