#linux #tee
Вопрос:
- Когда я использую
$ ls | tee log.txt
Я получаю правильный, ожидаемый результат: log.txt сохраняет вывод «ls».
- Мне нужно сохранить вывод команды:
$ svnadmin dump MyRepo -r1:r2 > dumpfile
* Dumped revision 1.
* Dumped revision 2.
Где «$ svnadmin .. » — это команда, а
«* Сброшено .. » — выходные данные
- Итак, сам вопрос. Когда я выполняю команду:
$ svnadmin dump MyRepo -r1:r2 > dumpfile | tee log.txt
* Dumped revision 1.
* Dumped revision 2.
log.txt имеет 0 размер
Ответ №1:
TL;DR-Попробуйте вот это:
svnadmin dump MyRepo -r1:r2 2>amp;1 > dumpfile | tee log.txt
Пояснение: Каждая команда имеет три подключенных «стандартных потока»: Стандартный ввод (STDIN, дескриптор файла 0), Стандартный вывод (STDOUT, 1) и Стандартная ошибка (STDERR, 2). Обычно команды выводят свои «данные» на STDOUT и ошибки на STDERR.
Простая команда, например ls
, позволяет подключить всех троих к консоли. Поскольку и STDOUT, и STDERR подключены к консоли, вывод команды чередуется.
Подобный «канал» ls | tee log.txt
перенаправляет STDOUT первой команды в STDIN второй команды. Ни больше, ни меньше. Поэтому все остальные потоки по — прежнему подключены к консоли. Если ls
часть выдает сообщения об ошибках, они будут записаны в консоль, а не в файл! Но в вашем ls
примере не было выведено никаких ошибок, поэтому вы не заметили.
После настройки канала оболочка вычисляет другого оператора перенаправления первой команды-слева направо.
Поэтому svnadmin dump > dumpfile | tee log.txt
перенаправит STDOUT svnadmin
на dumpfile
то, чтобы фактически не оставлять данных для tee
команды, потому что это перенаправление, а не копия.
svnadmin dump MyRepo 2>amp;1 > dumpfile | tee log.txt
добавляет еще один шаг перенаправления. Он гласит: «сделайте файловую ручку 2 (STDERR) копией файловой ручки 1 (STDOUT)», которая на данный момент является каналом. Запись в STDOUT или STDERR будет записываться в канал. Но после этого > dumpfile
применяется перенаправление, и STDOUT перенаправляется в файл.
Вы можете прочитать все это (и многое другое) в руководстве по оболочке. Ибо bash
это есть в разделе REDIRECTION
.
Комментарии:
1. Спасибо, может быть, добавите какое-нибудь объяснение: почему оригинальная версия не работает