Existem provavelmente maneiras menos detalhadas de fazer isso, mas a solução clássica seria algo como:
#!/bin/bash
trap 'rm $TMP' 0
TMP=$(mktemp)
rm $TMP
mkfifo $TMP
tee < $TMP ${log:-/tmp/log.txt} &
exec > $TMP 2>&1
Não é preciso dizer que há enormes preocupações de segurança e confiabilidade aqui, como qualquer outro processo pode ler ou escrever a partir do fifo. Se você quiser fazer esse tipo de coisa, é muito melhor usar um wrapper simples que canalize a saída do seu script para tee
.