Если порядок вывода должен быть:stdout, то stderr ; нет решения только с перенаправлением.
stderr должен храниться во временном файле
cmd 2>>file-err | tee -a file1 >>file2
cat file-err >> file1
rm file-err
Описание:
Единственный способ перенаправить один вывод (fd типа stdout или stderr )в два файла — это воспроизвести его. Команда tee
— правильный инструмент для воспроизведения содержимого файлового дескриптора. Таким образом, первоначальная идея иметь один вывод для двух файлов состоит в том, чтобы использовать:
... | tee file1 file2
Это воспроизводит стандартный ввод tee в оба файла (1 и 2 ), оставляя вывод tee по-прежнему неиспользованным. Но нам нужно добавить (use-a
)и нужна только одна копия. Это решает обе проблемы:
... | tee -a file1 >>file2
Чтобы поставить tee
с stdout (для повторения ), нам нужно использовать stderr непосредственно из команды. В одном случае, если порядок не важен, (порядок вывода будет (скорее всего )сохранен в том виде, в котором он был сгенерирован, то, что будет выведено первым, будет сохранено первым ). Либо:
cmd 2>>file1 | tee -a file2 >>file1
cmd 2>>file1 > >( tee -a file2 >>file1 )
( cmd | tee -a file2 ) >> file1 2>&1
Вариант 2 работает только в некоторых оболочках. Вариант 3 использует дополнительную подоболочку (медленнее ), но использует имена файлов только один раз.
Но если stdoutдолжен быть первым (в зависимости от того, в каком порядке генерируется вывод )нам нужно сохранить stderr, чтобы добавить его в конец файла (первое опубликованное решение ).