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

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
akond
источник
Можно ли перенаправить 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руководство больше.

strugee
источник
2

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

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

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

echo "foobarbaz" | tee file{1..8} > /dev/null
user149146
источник
2
Чем это действительно отличается от других ответов, которые уже даны? Тем более , что некоторые люди , вероятно , хотят буквальный file1Through , file8как их имена , и те, скорее всего пример заполнители для имен файлов
Эрик Ренуф
1
Вероятно, или нет, это именно то решение, которое мне было нужно, и подумал, что это может помочь кому-то еще.
user149146
-2

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

echo blabla |tee thisession >>allsessions

Gediz GÜRSU
источник
Команда teeуже упоминалась.
Ральф Фридл