На самом деле у меня недавно был похожий вопрос (хотя я не писал, я дошел до него), и из того, что я вижу, кажется, что использование set +e перед командой и set -e впоследствии работает наиболее элегантно. Вот пример, получая ответ команды и не позволяя ошибке выбросить ее.
#!/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
Это захватывает вывод 'fortune', проверяет его состояние выхода, а также повторяет и говорит это. Я думаю, это то, что вы просили, или хотя бы что-то подобное? В любом случае, надеюсь, это поможет.