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