Как перенаправить стандартный вывод на несколько файлов журнала? Следующее не работает:
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 отправит вывод на стандартный вывод в дополнение к указанным файлам.
Например, если это выполняется из консоли, вы увидите вывод там. Запустите из crontab, на выходе появится сообщение о состоянии, которое отправлено вам по почте (см. Также ответ Жиля здесь https://unix.stackexchange.com/a/100833/3998 ).
Это работало для меня в bash на Ubuntu 12.04 и было проверено в Ubuntu 14.04 с использованием GNU bash 4.3.11 (1), поэтому оно должно работать на любой последней версии GNU bash.
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
ответы, представленные выше. Оболочка соединяет стандартный вывод команды с процессом, который передает несколько файлов; Таким образом, нет никаких убедительных технических преимуществ , чтобы делать это таким образом (но это действительно выглядят действительно хорошо). Смотрите на zsh
руководство больше.
Невозможно комментировать, однако, другой способ выразить
echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null
Можно упростить это при работе со многими файлами.
echo "foobarbaz" | tee file{1..8} > /dev/null
file1
Through , file8
как их имена , и те, скорее всего пример заполнители для имен файлов
Мне нужен файл журнала сеанса и другой файл для всех сессий, которые я сделал:
echo blabla |tee thisession >>allsessions
tee
уже упоминалась.
zsh
, вы можете использоватьsome_command >output_log_1 >output_log_2
.