Se você quiser usar a saída de um programa em outro que só é executado após o primeiro comando concluído, provavelmente é mais fácil armazenar a saída em um arquivo.
errfile=$(mktemp)
if ! somecommand 2> "$errfile" ; then
log < "$errfile" # or log "$(cat "$errfile")" ?
fi
rm "$errfile"
Pipetar a saída exigiria que os comandos sejam executados ao mesmo tempo, mas só obtemos o código de saída quando o primeiro comando é concluído.
log < "$errfile"
acima, é claro, direcionaria a mensagem de erro para stdin de log
(como se fosse um pipe). Para obtê-lo como um argumento de linha de comando, use log "$(cat "$errfile")"
(um argumento) ou log $(cat "$errfile")
(com divisão de palavras, log
vê vários argumentos) ou log "$(< "$errfile")"
(não padrão, funciona pelo menos no Bash) .