Як перенаправити стандартний вихід на кілька файлів журналу? Наступне не працює:
some_command 1> output_log_1 output_log_2 2>&1
Як перенаправити стандартний вихід на кілька файлів журналу? Наступне не працює:
some_command 1> output_log_1 output_log_2 2>&1
Відповіді:
Дивіться man tee
:
НАЗВА: tee - читати зі стандартного вводу та записувати на стандартний вихід та файли
СИНОПИС: трійник [ВАРІАНТ] ... [ФАЙЛ] ...
Відповідно:
echo test | tee file1 file2 file3
cmd 2>&1 | tee log1 log2
я спробував виконати як вище, але мені потрібно натиснути ctrl-c, щоб перенаправити його на другий файл журналу. також вихід друкується на консолі. Я хочу, щоб командний результат був перенаправлений на журнали, але не на консоль. будь-яка допомога цінується.
tee
Команда записує stdin
у файл (и), а також в stdout
. Якщо ви не хочете, щоб вихід відображався на терміналі, вам доведеться перенаправляти так, /dev/null
як зазвичай.
echo test | tee --append file1 file2
Скажімо, ваш вихід генерується з функції cmd()
:
cmd() {
echo hello world!
}
Для перенаправлення виводу з cmd
двох файлів, але не до консолі, ви можете використовувати:
cmd | tee file1 file2 >/dev/null
Це буде працювати для декількох файлів, враховуючи будь-яке джерело даних, яке проходить до трійника:
echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null
Це також буде працювати:
echo $(cmd) | tee file1 file2 >/dev/null
Без /dev/null
перенаправлення, tee надішле вихід на stdout на додаток до вказаних файлів.
Наприклад, якщо це запускається з консолі, ви побачите там вихід. Запустившись з кронтабуляції, на виході з’явиться повідомлення про стан, яке вам надіслано (див. Також відповідь Гілла тут https://unix.stackexchange.com/a/100833/3998 ).
Це працювало для мене в bash на Ubuntu 12.04 і було підтверджено в Ubuntu 14.04 за допомогою GNU bash 4.3.11 (1), тому він повинен працювати на будь-якій останній версії bash GNU.
version 4.3.11(1)-release (i686-pc-linux-gnu)
) в Ubuntu 14.04.
Це стара публікація, але я зараз її знайшов ...
Замість того, щоб перенаправляти вихід до нього, > /dev/null
ви можете перенаправити його на останній файл:
echo "foobarbaz" | tee file1 > file2
Або для додавання виводу:
echo "foobarbaz" | tee -a file1 >> file2
-a
трійника)
Як згадував @jofel у коментарі під відповіддю, це можна зробити на самому місці zsh
:
echo foobar >file1 >file2 >file3
або, з розширенням дужок:
echo foobar >file{1..3}
Всередині це працює дуже подібно до tee
відповідей, поданих вище. Оболонка з'єднує stdout команди з процесом, який передає декілька файлів; Таким чином, немає ніяких переконливих технічних переваг , щоб робити це таким чином (але це дійсно виглядають дійсно добре). Докладніше див. У zsh
посібнику .
Однак неможливо прокоментувати інший спосіб висловити
echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null
Це може бути спрощено до цього при роботі з багатьма файлами.
echo "foobarbaz" | tee file{1..8} > /dev/null
file1
через , file8
як їх імена , і ті швидше за все лише приклад наповнювачі для імен файлів
zsh
, ви можете використовуватиsome_command >output_log_1 >output_log_2
.