Use apenas:
{ err=$(cmd 2>&1 >&3 3>&-); } 3>&1
Para obter o stderr de cmd
deixando seu stdout intocado (aqui usando fd3 para trazer o stdout original (copiado com 3>&1
) dentro da substituição do comando (restaurado com >&3
depois de ter redirecionado o fd 2 para o pipe criado pela substituição do comando com 2>&1
)).