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 )).