как перенаправить вывод в несколько файлов журнала


52

Как перенаправить стандартный вывод на несколько файлов журнала? Следующее не работает:

some_command 1> output_log_1 output_log_2 2>&1

6
С zsh, вы можете использовать some_command >output_log_1 >output_log_2.
Джофель

Ответы:


70

Смотрите man tee:

ИМЯ: tee - читать со стандартного ввода и записывать в стандартный вывод и файлы

ОПИСАНИЕ: тройник [ОПЦИЯ] ... [ФАЙЛ] ...

Соответственно:

echo test | tee file1 file2 file3

Можно ли перенаправить stderr более чем в один файл?
fromnaboo

Да, это можно сделать с помощью перенаправления: find / -name test 2> & 1 | тройник файл1
файл2 файл3

@akond, cmd 2>&1 | tee log1 log2 я пытался выполнить, как указано выше, но мне нужно нажать Ctrl-C, чтобы перенаправить его во второй файл журнала. также вывод печатается на консоли. Я хочу, чтобы вывод команды перенаправлялся в журналы, но не на консоль. любая помощь приветствуется.
двухэтажный

@doubledecker Команда teeзаписывает stdinв файл (ы), а также в stdout. Если вы не хотите, чтобы вывод отображался на терминале, вы должны перенаправить его, /dev/nullкак обычно.
Minix

4
Также возможно добавить несколько файлов:echo test | tee --append file1 file2
user1364368

13

Допустим, ваш вывод генерируется из функции 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 отправит вывод на стандартный вывод в дополнение к указанным файлам.

Например, если это выполняется из консоли, вы увидите вывод там. Запустите из crontab, на выходе появится сообщение о состоянии, которое отправлено вам по почте (см. Также ответ Жиля здесь https://unix.stackexchange.com/a/100833/3998 ).

Это работало для меня в bash на Ubuntu 12.04 и было проверено в Ubuntu 14.04 с использованием GNU bash 4.3.11 (1), поэтому оно должно работать на любой последней версии GNU bash.


@doubledecker - похоже, он удовлетворяет вашим условиям, поэтому может быть принят в качестве ответа. Кроме того, +1, как я тестировал это под GNU bash ( version 4.3.11(1)-release (i686-pc-linux-gnu)) в Ubuntu 14.04.
Белаква

9

Это старый пост, но я нашел его сейчас ...

Вместо перенаправления вывода > /dev/nullвы можете перенаправить его в последний файл:

echo "foobarbaz" | tee file1 > file2

Или для добавления вывода:

echo "foobarbaz" | tee -a file1 >> file2

это более или менее то, что сказал другой ответ (кроме как -a в ти)
Архемар

Это путь.
71GA

5

Как упомянул @jofel в комментарии к ответу, это может быть сделано изначально в zsh:

echo foobar >file1 >file2 >file3

или с расширением скобки:

echo foobar >file{1..3}

Внутренне это работает очень похоже на teeответы, представленные выше. Оболочка соединяет стандартный вывод команды с процессом, который передает несколько файлов; Таким образом, нет никаких убедительных технических преимуществ , чтобы делать это таким образом (но это действительно выглядят действительно хорошо). Смотрите на zshруководство больше.


2

Невозможно комментировать, однако, другой способ выразить

echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null

Можно упростить это при работе со многими файлами.

echo "foobarbaz" | tee file{1..8} > /dev/null

2
Чем это действительно отличается от других ответов, которые уже даны? Тем более , что некоторые люди , вероятно , хотят буквальный file1Through , file8как их имена , и те, скорее всего пример заполнители для имен файлов
Эрик Ренуф

1
Вероятно, или нет, это именно то решение, которое мне было нужно, и подумал, что это может помочь кому-то еще.
user149146

-2

Мне нужен файл журнала сеанса и другой файл для всех сессий, которые я сделал:

echo blabla |tee thisession >>allsessions


Команда teeуже упоминалась.
Ральф Фридл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.