Con una bash recente, puoi usare la sostituzione del processo.
foo 2> >(tee stderr.txt)
Questo invia semplicemente stderr a un programma che esegue tee.
Più portabilità
exec 3>&1
foo 2>&1 >&3 | tee stderr.txt
Questo fa sì che il descrittore di file 3 sia una copia dello stdout corrente (cioè lo schermo), quindi imposta la pipe ed esegue foo 2>&1 >&3
. Questo invia lo stderr di foo nello stesso posto dell'attuale stdout, che è la pipe, quindi invia lo stdout a fd 3, l'output originale. La pipe alimenta lo stderr originale di foo to tee, che lo salva in un file e lo invia allo schermo.