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