Você poderia fazer (POSIXly):
if { cmd 2>&1 >&3 3>&- | grep '^' >&2; } 3>&1; then
echo there was some output on stderr
fi
Ou para preservar o status de saída original se não for zero:
fail_if_stderr() (
rc=$({
("$@" 2>&1 >&3 3>&- 4>&-; echo "$?" >&4) |
grep '^' >&2 3>&- 4>&-
} 4>&1)
err=$?
[ "$rc" -eq 0 ] || exit "$rc"
[ "$err" -ne 0 ] || exit 125
) 3>&1
Usando o código de saída 125
para os casos em que o comando retorna com um status de saída 0, mas produz uma saída de erro.
Para ser usado como:
fail_if_stderr cmd its args || echo "Failed with $?"