Как сохранить вывод команды в файл?
Есть ли способ без использования какого-либо программного обеспечения? Я хотел бы знать, как.
Как сохранить вывод команды в файл?
Есть ли способ без использования какого-либо программного обеспечения? Я хотел бы знать, как.
Ответы:
Да, это возможно, просто перенаправить вывод в файл:
SomeCommand > SomeFile.txt
Или, если вы хотите добавить данные:
SomeCommand >> SomeFile.txt
Если вы также хотите stderr
использовать это:
SomeCommand &> SomeFile.txt
или это добавить:
SomeCommand &>> SomeFile.txt
если вы хотите, чтобы stderr
и консоль, и вывод отображались на консоли и в файле, используйте это:
SomeCommand 2>&1 | tee SomeFile.txt
(Если вы хотите только вывод, опустите 2
выше)
make
команды в файл, вместо этого требуется следующий синтаксис: make > someFile.txt 2>&1
(источник: linuxquestions.org/questions/linux-newbie-8/… )
Чтобы записать вывод команды в файл, существует в основном 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
Как стандартный вывод, так и стандартные потоки ошибок будут скопированы в файл, пока они будут видны в терминале. Если файл уже существует, новые данные будут добавлены в конец файла.
2>&1
перенаправляет STDERR в STDOUT, 1>&2
перенаправляет STDOUT в STDERR и 3>&1
перенаправляет поток 3 в STDERR.
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
на моем сервере. Благодарю.
sh
а не bash
(или, может быть, bash
в sh
режиме ...). Вы можете проверить, что именно использует ваш текущий процесс оболочки ps -p $$ -o cmd=
, потому что echo $SHELL
он ненадежен и покажет вам вашу оболочку входа в систему, игнорируя, возможно, вы запустили другую подоболочку.
Вы также можете использовать tee
для отправки вывода в файл:
command | tee ~/outputfile.txt
Небольшая модификация также поймает stderr:
command 2>&1 | tee ~/outputfile.txt
или немного короче и менее сложный:
command |& tee ~/outputfile.txt
tee
полезно, если вы хотите иметь возможность записывать вывод команды, а также просматривать ее в режиме реального времени .
2>&1
?
Вы можете перенаправить вывод команды в файл:
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
ls
и grep
, поддерживают --color=auto
, который выводит цветовые коды, только если стандартный вывод является терминалом.
Для 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
которых уже должен убедить вас , что это плохая идея.
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
Дополнительная информация: Как я могу сохранить вывод команды в файл в режиме реального времени?
someCommand 2> someFile.txt
иsomeCommand 2>> someFile.txt
также перенаправляетstterr
на someFile.txt