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