Linux: неправильное использование tee

#linux #tee

Вопрос:

  1. Когда я использую
 $ ls | tee log.txt
 

Я получаю правильный, ожидаемый результат: log.txt сохраняет вывод «ls».

  1. Мне нужно сохранить вывод команды:
 $ svnadmin dump MyRepo -r1:r2 > dumpfile
* Dumped revision 1.
* Dumped revision 2.
 

Где «$ svnadmin .. » — это команда, а
«* Сброшено .. » — выходные данные

  1. Итак, сам вопрос. Когда я выполняю команду:
 $ 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. Спасибо, может быть, добавите какое-нибудь объяснение: почему оригинальная версия не работает