В оболочке, как объединить stdout и stderr в порядке вывода и разделить stderr? - PullRequest
1 голос
/ 15 февраля 2020

В целях ведения журнала сборки я хочу иметь сценарий оболочки, сочетающий stderr и stdout команды, но также сохраняющий stderr только отдельно, чтобы я мог показывать stderr заметно в начале. Но также объедините их, чтобы, вероятно, провести дальнейший анализ, включая сообщения stdout, если это необходимо.

Пробовал много раз с ти и дескрипторами файлов, но я не могу заставить этот материал работать.

Я уже нашел что для zsh это должно работать cmd &> all.txt and 2> out.txt, но, к сожалению, не для sh.

Мне также удалось собрать их в один файл один раз, но это было не по порядку, я получил все ошибки за которым следует стандартный вывод или наоборот.

Если вы попробуете что-то, это должно быть sh.

Это мой тестовый скрипт:

>&2 echo "error0"
echo "out0"
>&2 echo "error1"
echo "out1"
>&2 echo "error2"
echo "out2"

Выходы должны быть:

error0
out0
error1
out1
error2
out2 

и:

error0
error1
error2

1 Ответ

0 голосов
/ 16 февраля 2020
#!/bin/sh
mkfifo logpipe errpipe
tee -a errlog >logpipe <errpipe&
cat logpipe >log&
{ echo foo; echo bar >&2; } >logpipe 2>errpipe
rm logpipe errpipe

Наилучшие результаты, которые я мог получить за dash (см. Обсуждение буферизации в комментариях):

stdbuf -e0 -o0 test.sh 2>&1 >>log | tee -a log >errlog

С test.sh:

#!/bin/sh
for i in `seq 10`; do
  echo "error$i" >&2
  echo "out$i"
done

Я получаю результаты вроде:

$ cat log
out1
out2
error1
out3
error2
error3
out4
error4
out5
error5
out6
error6
out7
error7
out8
error8
out9
error9
out10
error10
$ cat errlog
error1
error2
error3
error4
error5
error6
error7
error8
error9
error10

Иногда лучше, иногда хуже.

...