O problema é que || liga mais que ; , então sua primeira linha consiste em dois comandos: o primeiro é um comando composto: ls || ls || echo e o segundo é apenas exit 3 . Como mencionado em um comentário do meuh, você deve escrever
ls a || ls > /dev/null || { echo "both command fails"; exit 3; }
echo 5 # not showed up