Com um bash recente, você pode usar a substituição de processos.
foo 2> >(tee stderr.txt)
Isto apenas envia stderr para um programa rodando tee.
Mais portably
exec 3>&1
foo 2>&1 >&3 | tee stderr.txt
Isso faz com que o descritor de arquivos 3 seja uma cópia do stdout atual (ou seja, a tela), depois configura o canal e executa foo 2>&1 >&3
. Isso envia o stderr de foo para o mesmo local que o stdout atual, que é o pipe, e envia o stdout para fd 3, a saída original. O pipe alimenta o stderr original de foo para tee, que salva em um arquivo e o envia para a tela.