Только последний тройник записывает в файл (возможно, перекрытие с exec?)

275
Vulpo

Я пытаюсь перенаправить все свои выходные данные a.out, кроме тех, которые также должны быть записаны b.out. Я думаю, что было бы неплохо использовать exec поверх tee (tee также перенаправить на b.out), но tee не всегда выглядит одинаково (похоже, работает только последний):

#!/bin/bash exec > a.out ls /boot |tee b.out #redirected to a.out only! ls /var |tee b.out #redirected to a.out only! ls /run |tee b.out #redirected to a.out only! ls /home |tee b.out #redirected to a.out and b.out (good) echo "a" #redirected to a.out (good) 

То же самое для кш. Для информации, ни один из ls не вызывает ошибку. Почему иногда не удается распознать вывод?

1

1 ответ на вопрос

4
Kamil Maciorowski

Каждый teeоткрывается b.outсамостоятельно и перезаписывает его самостоятельно. В самом конце вы видите только b.outиз последнего tee(обратите внимание, что это не зависит от предыдущего exec, поэтому первоначальный заголовок вопроса « teeвнутри exec, случайное перенаправление» был довольно обманчивым).

Если вы проверите b.outмежду tee-s, вы заметите, что он содержит только выходные данные tee. Вы можете сделать это, набрав ваши команды одну за другой (без перенаправления на a.out) и вызывая cat b.outпосле каждой.

Перенаправление на a.outнесколько отличается. Когда exec, a.outоткрыто оболочка только один раз, и все, что перенаправляется на это добавляемое.

Решение: использовать tee -a. От man tee:

-a, --append
добавьте к данным файлам, не перезаписывайте

Я чувствую себя плохо, даже не применяя простейшее правило отладки кода - по одной строке за раз. Кроме того, было очевидно, что футболка не добавляется, а перезаписывается по умолчанию. Спасибо, я отредактирую название вопроса, как предложено. Vulpo 6 лет назад 1