перенаправить stdout и stderr в файл и stderr на экран при сохранении порядка вывода - PullRequest
0 голосов
/ 21 января 2019

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

Но, похоже, ни один из них не выполняет то, что я хочу, или сохраняю порядок.

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

#!/bin/bash

echo "1: good" >&1
echo "2: error" >&2
echo "3: error" >&2
echo "4: good" >&1
echo "5: error" >&2
echo "6: good" >&1
echo "7: error" >&2
echo "8: good" >&1
echo "9: error" >&2

Что у меня так далеко:

$ ./test.sh 2>&1 > output.log

1 Ответ

0 голосов
/ 21 января 2019

Стандартная семантика UNIX не позволяет этого;это не может быть надежно выполнено с использованием только средств, встроенных в bash или указанных в POSIX.

Записи имеют только гарантированный порядок относительно друг друга, когда они происходят с одним и тем же пунктом назначения.Как только вы перенаправляете stdout и stderr в разные места назначения, операционная система больше не дает гарантий относительно порядка выполнения записей в них ;вдвойне, когда эти записи выполняются в отдельном процессе (таком как tee), который затем должен прочитать содержимое и выполнить свои собственные дальнейшие записи при условии планирования на уровне ОС.

Возможно использование уровня syscallсредства трассировки, предоставляемые (или доступные) для вашей операционной системы, для генерации абсолютного упорядочения системных вызовов и, таким образом, для генерации окончательно упорядоченного вывода;пример этого дан в ответе на Отдельное перенаправление и рекомбинация stderr / stdout без потери порядка .

Используя сам bash, однако вы можете контролировать только то, где файловые дескрипторы подпроцессаподключен, а не то, как содержимое, записанное в эти дескрипторы, буферизируется и сбрасывается, поэтому просто недостаточно контроля, чтобы сделать то, что вы просите, возможным, без записи, подлежащей переупорядочению.

...