Um pipe nomeado pode funcionar para você. Com apenas um pouco mais de trabalho, você pode obtê-lo de forma robusta e sem ter que configurar trap s ou similar para lidar com a limpeza do sistema de arquivos depois - basta fazer a limpeza antecipadamente.
pipe=/tmp/$$pipe log=mylog.txt
mkfifo "$pipe"; exec 3<>"$pipe"
{ rm "$pipe"; tee "$log"; } <&3 >/dev/tty &
pipe=$!; exec >&3 3>&-
Lá. A partir deste momento, toda a saída do script está sendo gravada em um canal nomeado (usado para ser) que está sendo lido por um processo tee de base reversa. O arquivo especial do pipe nomeado já foi removido do sistema de arquivos e, portanto, ele não precisa ser limpo mais tarde e as únicas referências a ele que permanecem são os descritores de arquivo atribuídos ao stdout e tee do seu script stdin .
Dito isso, convém configurar pelo menos um trap :
trap "kill PIPE $pipe" 0
... apenas para garantir que tee não fique em segundo plano após o script sair.
Se você se deparar com problemas de buffer - o que não deve ser um problema, eu acho, já que tee tem uma linha aberta em /dev/tty - você pode tentar sua sorte chamando tee via stdbuf . A página stdbuf man especifica especificamente as suas apostas, onde tee está interessado - nota tee como uma aplicação que provavelmente reajustará seus próprios buffers após a invocação - mas é mais positiva sobre a interação do que é para dd de qualquer maneira.