Как отправить STDOUT в файл и STDOUT + STDERR в другой файл в bash-скрипте? - PullRequest
1 голос
/ 25 марта 2019

Я хочу написать скрипт оболочки bash, который перенаправляет STDOUT в файл "result.log", STDERR + STDOUT в файл "complete.log. Лучшим будет третий файл, в котором только STDERR suc как "error.log. Наконец покажите STDOUT для терминала

Linux mint 19.1

#!/bin/bash
exec  > >(tee -a result.log full.log) 
exec 2>>full.log 
echo "This is stdout" 
echo "This is stderr" >&2 
echo "This is stdout 2" 
echo "This is stderr 2" >&2 
echo "This is stdout 3" 
echo "This is stderr 3" >&2 
echo "This is stdout 4" 
echo "This is stderr 4" >&2 

выход

full.log:This is stderr 
full.log:This is stderr 2
full.log:This is stderr 3 
full.log:This is stderr 4
full.log:This is stdout
full.log:This is stdout 2
full.log:This is stdout 3
full.log:This is stdout 4
result.log:This is stdout
result.log:This is stdout 2
result.log:This is stdout 3
result.log:This is stdout 4

Ожидаемое

full.log:This is stdout
full.log:This is stderr
full.log:This is stdout 2
full.log:This is stderr 2
full.log:This is stdout 3
full.log:This is stderr 3
full.log:This is stdout 4
full.log:This is stderr 4
result.log:This is stdout
result.log:This is stdout 2
result.log:This is stdout 3
result.log:This is stdout 4

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Следующее решение работает, только если bash поддерживает /dev/fd/NUM. Сохраняет вывод в порядке.

#!/bin/bash
exec 1>>result.log 2>>full.log

echo "This is stdout"   | tee -a /dev/fd/2
echo "This is stderr"   >&2 
echo "This is stdout 2" | tee -a /dev/fd/2
echo "This is stderr 2" >&2 
echo "This is stdout 3" | tee -a /dev/fd/2
echo "This is stderr 3" >&2 
echo "This is stdout 4" | tee -a /dev/fd/2
echo "This is stderr 4" >&2
0 голосов
/ 25 марта 2019

Попробуйте это так:

exec 1> >(tee -a result.log >>full.log)
exec 2>>full.log

Но учтите, что порядок вывода в full.log теперь:

This is stderr
This is stderr 2
This is stderr 3
This is stderr 4
This is stdout
This is stdout 2
This is stdout 3
This is stdout 4
...