En realidad, tuve una pregunta similar recientemente (aunque no publiqué, me di cuenta), y, por lo que puedo ver, parece que solo uso set + e antes del comando y set -e después funciona de manera más elegante. Aquí hay un ejemplo, agarrando la respuesta del comando y no dejando que el error lo descarte.
#!/bin/sh
args=""
for argcol in $*
do
args="${args} ${argcol}"
done
fortunevar=""
fortfail=""
{
set +e
fortunevar=`fortune $args`
fortfail=$?
set -e
} &> /dev/null
if [ $fortfail == 0 ]
then
echo ${fortunevar}
say ${fortunevar}
else
echo misfortune: an illegal option was detected!
echo misfortune: usage: misfortune [-afilosw] [-m pattern][ [#%] file/directory/all]
fi
Esto toma la salida de 'fortuna', verifica su estado de salida, y hace eco y lo dice. Creo que esto es lo que estabas pidiendo, o al menos algo similar. De todos modos, espero que esto ayude.