simething simplier. это основано на bashizm внутренней вилки на первый, тестовый скрипт:
#!/bin/bash
for i in {1..1000}; do
echo STDOUT $i>&1
echo STDERR $i>&2
done
и рядом, перенаправляя сценарий:
(./xxtext.sh 1>>logfile)2>&1|\ #subprocess/fork in brackets with redir stdout to logfile.
#above, main process redirect stderr to stdout for properly pipe
while read x; do echo $x; echo $x>>logfile; done #second read sequently stdin
#redirected from stderr, and both print to the screen and append to logfile.
К сожалению, это не спасло правильно последовательность, потому что два потока управляются двумя различными процесса с буферизацией труб с ними.
Если вы действительно хотите сохранить последовательность, единственный способ - использовать системный вызов 'select' и читать как stdout, так и stderr из внутреннего скрипта. Я верю, что bash этого не поддерживает. Вы можете сделать это на C или Perl или другом более продвинутом языке. Полезный пример в perl i, найденный по адресу: http://www.perlmonks.org/bare/?node_id=419919 Это вызов команды bc.