Na verdade, tive uma pergunta semelhante recentemente (embora não tenha postado, cheguei a ela) e, pelo que posso ver, parece que apenas use set + e antes do comando e set -e depois funcionem com mais elegância. Aqui está um exemplo, pegando a resposta do comando e não deixando o erro jogá-lo fora.
#!/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
Isso agarra a saída da 'fortuna', verificando seu status de saída, ecoando e dizendo isso. Eu acho que é isso que você estava pedindo, ou pelo menos algo parecido? Enfim, espero que isso ajude.