Meu problema era com os comandos "echo" FORA das minhas funções que lidavam com o redirecionamento. Todas as tentativas que fiz inicialmente estavam dentro da minha função. Para resolver isso, criei uma nova função "echo" que descompacta cada chamada de eco e uso "echo de comando" quando não quero utilizar a função. Isso obviamente só irá descomprimir os comandos de eco. Qualquer outro executável que produza texto também pode causar buffering.
#!/bin/bash
function stdOutput
{
typeset strLogFile=$1; shift
typeset strLogID=$1; shift
while IFS='' read -r strInput
do
command echo "$(eval command echo ${strLogID})${strInput}" && command echo "$(eval command echo ${strLogID})${strInput}" >> ${strLogFile}
done
}
function errOutput
{
typeset strLogFile=$1; shift
typeset strLogID=$1; shift
while IFS='' read -r strInput
do
>&2 command echo "$(eval command echo ${strLogID})${strInput}" && command echo "$(eval command echo ${strLogID})${strInput}" >> ${strLogFile}
done
}
function echo
{
typeset strParameters=$@
typeset strExecutable=$(which echo)
unbuffer ${strExecutable} $@
}
function main
{
stdLogID="\<STD\>!"'$'"(date +\"%Y-%m-%d!%H:%M:%S\")!"
errLogID="\<ERR\>!"'$'"(date +\"%Y-%m-%d!%H:%M:%S\")!"
logFile=/tmp/out.log
> $logFile
exec 3>&1 1> >(stdOutput ${logFile} "${stdLogID}"\$"{FUNCNAME[1]}!")
exec 4>&2 2> >(errOutput ${logFile} "${errLogID}"\$"{FUNCNAME[1]}!")
>&2 echo "Line1"
echo "Line2"
>&2 echo "Line3"
echo "Line4"
>&2 echo "Line5"
echo "Line6"
>&2 echo "Line7"
echo "Line8"
>&2 echo "Line9"
echo "Line10"
exec 1>&3 3>&-
exec 2>&4 4>&-
}
main
sync
exit